{
 "nbformat": 4,
 "nbformat_minor": 0,
 "metadata": {
  "colab": {
   "provenance": [],
   "collapsed_sections": []
  },
  "kernelspec": {
   "name": "python3",
   "display_name": "Python 3"
  }
 },
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "jpZVKRrOLKt1",
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "# Billiards in Φ<sub>Flow</sub>\n",
    "\n",
    "This notebook reproduces the [billiards example](https://github.com/taichi-dev/difftaichi/blob/master/examples/billiards.py) described in the [DiffTaichi paper](https://arxiv.org/abs/1910.00935) using [Φ<sub>Flow</sub>](https://github.com/tum-pbs/PhiFlow)."
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "id": "ln5JJXpHLYjT",
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "outputId": "3fcc7af7-5f49-4643-ff30-edd349c7b7ef",
    "pycharm": {
     "name": "#%%\n",
     "is_executing": true
    }
   },
   "source": [
    "# !pip install phiflow"
   ],
   "execution_count": null,
   "outputs": []
  },
  {
   "cell_type": "markdown",
   "source": [
    "The import statement decides whether to use TensorFlow, PyTorch or Jax."
   ],
   "metadata": {
    "id": "BxQ0vjx9PBQ4",
    "pycharm": {
     "name": "#%% md\n"
    }
   }
  },
  {
   "cell_type": "code",
   "metadata": {
    "id": "WKfegCz9LF4Q",
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "source": [
    "# from phi.tf.flow import *\n",
    "from phi.torch.flow import *\n",
    "# from phi.jax.stax.flow import *"
   ],
   "execution_count": 2,
   "outputs": []
  },
  {
   "cell_type": "markdown",
   "source": [
    "First, we create the typical billiards triangle with four layers and a ball radius of 0.03.\n",
    "We use the Φ<sub>Flow</sub> geometry class `Sphere` to represent the balls."
   ],
   "metadata": {
    "id": "oLDzFnvzOZoU",
    "pycharm": {
     "name": "#%% md\n"
    }
   }
  },
  {
   "cell_type": "code",
   "source": [
    "def billiards_triangle(billiard_layers=4, radius=.03):\n",
    "    coords = []\n",
    "    for i in range(billiard_layers):\n",
    "        for j in range(i + 1):\n",
    "            coords.append(vec(x=i * 2 * radius + 0.5, y=j * 2 * radius + 0.5 - i * radius * 0.7))\n",
    "    return Sphere(stack(coords, instance('balls')), radius=radius)\n",
    "  \n",
    "plot(billiards_triangle())"
   ],
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 386
    },
    "id": "sgIe0yrXPUwG",
    "outputId": "d5624dbc-3cbf-46d1-85fd-801520cf8953",
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "execution_count": 3,
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "<Figure size 864x360 with 1 Axes>"
      ]
     },
     "metadata": {},
     "execution_count": 3
    },
    {
     "output_type": "display_data",
     "data": {
      "text/plain": [
       "<Figure size 864x360 with 1 Axes>"
      ],
      "image/png": "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\n"
     },
     "metadata": {
      "needs_background": "light"
     }
    }
   ]
  },
  {
   "cell_type": "markdown",
   "source": [
    "Next, we define the dynamics consisting of linear movement and collisions with an elasticity of 0.8.\n",
    "From here on, we will represent the system using a `phi.field.PointCloud` object storing the spheres and their velocities.\n",
    "Below, we test the step with a simple pair collision."
   ],
   "metadata": {
    "id": "tVehUdPYPW8x",
    "pycharm": {
     "name": "#%% md\n"
    }
   }
  },
  {
   "cell_type": "code",
   "source": [
    "def physics_step(v: PointCloud, dt: float, elasticity=0.8):\n",
    "    v_next = advect.points(v, v, dt)\n",
    "    dist = v_next.points - rename_dims(v_next.points, 'balls', 'others')\n",
    "    dist_norm = math.vec_length(dist, eps=1e-4)  # eps to avoid NaN during backprop of sqrt\n",
    "    rel_v = v.values - rename_dims(v.values, 'balls', 'others')\n",
    "    dist_dir = math.safe_div(dist, dist_norm)\n",
    "    projected_v = dist_dir.vector * rel_v.vector\n",
    "    has_impact = (projected_v < 0) & (dist_norm < 2 * v.geometry.radius)\n",
    "    impulse = -(1 + elasticity) * .5 * projected_v * dist_dir\n",
    "    radius_sum = v.geometry.radius + rename_dims(v.geometry.radius, 'balls', 'others')\n",
    "    impact_time = math.safe_div(dist_norm - radius_sum, projected_v)\n",
    "    x_inc_contrib = math.sum(math.where(has_impact, math.minimum(impact_time - dt, 0) * impulse, 0), 'others')\n",
    "    v = v.with_elements(v.geometry.shifted(x_inc_contrib))\n",
    "    v += math.sum(math.where(has_impact, impulse, 0), 'others')\n",
    "    return advect.points(v, v, dt)\n",
    "\n",
    "# Simple animated test for physics_step\n",
    "balls = Sphere(tensor([(0, .03), (.5, 0)], instance('balls'), channel(vector='x,y')), radius=.03)\n",
    "ball_v = PointCloud(balls, tensor([(1., 0), (0, 0)], shape(balls)))\n",
    "trj = iterate(physics_step, batch(t=20), ball_v, f_kwargs={'dt': .05})\n",
    "plot(trj.geometry, animate='t')"
   ],
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 399
    },
    "id": "DMvSa5ilPxrU",
    "outputId": "5e694b14-66fd-4491-a11b-45ab037b848e",
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "execution_count": 14,
   "outputs": [
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "<matplotlib.animation.FuncAnimation at 0x7f15a542aa90>"
      ],
      "text/html": [
       "<video width=\"864\" height=\"360\" controls autoplay loop>\n",
       "  <source type=\"video/mp4\" src=\"data:video/mp4;base64,AAAAHGZ0eXBNNFYgAAACAGlzb21pc28yYXZjMQAAAAhmcmVlAAAbOG1kYXQAAAKuBgX//6rcRem9\n",
       "5tlIt5Ys2CDZI+7veDI2NCAtIGNvcmUgMTUyIHIyODU0IGU5YTU5MDMgLSBILjI2NC9NUEVHLTQg\n",
       "QVZDIGNvZGVjIC0gQ29weWxlZnQgMjAwMy0yMDE3IC0gaHR0cDovL3d3dy52aWRlb2xhbi5vcmcv\n",
       "eDI2NC5odG1sIC0gb3B0aW9uczogY2FiYWM9MSByZWY9MyBkZWJsb2NrPTE6MDowIGFuYWx5c2U9\n",
       "MHgzOjB4MTEzIG1lPWhleCBzdWJtZT03IHBzeT0xIHBzeV9yZD0xLjAwOjAuMDAgbWl4ZWRfcmVm\n",
       "PTEgbWVfcmFuZ2U9MTYgY2hyb21hX21lPTEgdHJlbGxpcz0xIDh4OGRjdD0xIGNxbT0wIGRlYWR6\n",
       "b25lPTIxLDExIGZhc3RfcHNraXA9MSBjaHJvbWFfcXBfb2Zmc2V0PS0yIHRocmVhZHM9MyBsb29r\n",
       "YWhlYWRfdGhyZWFkcz0xIHNsaWNlZF90aHJlYWRzPTAgbnI9MCBkZWNpbWF0ZT0xIGludGVybGFj\n",
       "ZWQ9MCBibHVyYXlfY29tcGF0PTAgY29uc3RyYWluZWRfaW50cmE9MCBiZnJhbWVzPTMgYl9weXJh\n",
       "bWlkPTIgYl9hZGFwdD0xIGJfYmlhcz0wIGRpcmVjdD0xIHdlaWdodGI9MSBvcGVuX2dvcD0wIHdl\n",
       "aWdodHA9MiBrZXlpbnQ9MjUwIGtleWludF9taW49MTAgc2NlbmVjdXQ9NDAgaW50cmFfcmVmcmVz\n",
       "aD0wIHJjX2xvb2thaGVhZD00MCByYz1jcmYgbWJ0cmVlPTEgY3JmPTIzLjAgcWNvbXA9MC42MCBx\n",
       "cG1pbj0wIHFwbWF4PTY5IHFwc3RlcD00IGlwX3JhdGlvPTEuNDAgYXE9MToxLjAwAIAAAApPZYiE\n",
       "ABD//veBvzLLXyK6yXH5530srM885DxyXYmuuNAAAAMAAAMAAAMABiMSN/6H8XjN/AAAAwAAt8b/\n",
       "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\n",
       "AB1kYXRhAAAAAQAAAABMYXZmNTcuODMuMTAw\n",
       "\">\n",
       "  Your browser does not support the video tag.\n",
       "</video>"
      ]
     },
     "metadata": {},
     "execution_count": 14
    },
    {
     "output_type": "display_data",
     "data": {
      "text/plain": [
       "<Figure size 432x288 with 0 Axes>"
      ]
     },
     "metadata": {}
    }
   ]
  },
  {
   "cell_type": "markdown",
   "source": [
    "Now, we can define our objective. We stick to the definition of the DiffTaichi paper, desiring the last ball in the triangle to reach the target position (x=0.9, y=0.75).\n",
    "The loss function sets up our system consisting of the 10 balls in triangle formation plus the cue ball. The initial position and velocity of the cue ball is specified via the parameters `x0` and `v0`.\n",
    "1024 time steps of the simulation are performed before the distance $L^2$ loss is computed and returned."
   ],
   "metadata": {
    "id": "qCYso0kUQE39",
    "pycharm": {
     "name": "#%% md\n"
    }
   }
  },
  {
   "cell_type": "code",
   "source": [
    "def loss_function(x0: Tensor, v0: Tensor, goal=vec(x=0.9, y=0.75), steps=1024):\n",
    "    triangle_balls = PointCloud(billiards_triangle()) * (0, 0)\n",
    "    controllable_ball = PointCloud(Sphere(expand(x0, instance(triangle_balls).with_size(1)), radius=triangle_balls.geometry.radius)) * v0\n",
    "    all_balls = controllable_ball & triangle_balls\n",
    "    trj = iterate(physics_step, batch(t=steps), all_balls, f_kwargs={'dt': 0.003})\n",
    "    return math.l2_loss(trj.t[-1].balls[-1] - goal), trj"
   ],
   "metadata": {
    "id": "0rBCdr8TRaC3",
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "execution_count": 15,
   "outputs": []
  },
  {
   "cell_type": "markdown",
   "source": [
    "Let's plot one simulated trajectory! We only show every 16th frame."
   ],
   "metadata": {
    "id": "pyIxOIhrSYXe",
    "pycharm": {
     "name": "#%% md\n"
    }
   }
  },
  {
   "cell_type": "code",
   "source": [
    "plot(loss_function(x0=vec(x=.1, y=.5), v0=vec(x=.3, y=0))[1].t[::16].geometry, animate='t')"
   ],
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 468
    },
    "id": "qPfP4sJoR6Uw",
    "outputId": "f517e1eb-391b-46b9-b6ee-ce4e0813cf97",
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "execution_count": 16,
   "outputs": [
    {
     "output_type": "stream",
     "name": "stderr",
     "text": [
      "/usr/local/lib/python3.7/dist-packages/phi/field/_field_math.py:405: RuntimeWarning: concat() default implementation is slow on large dimensions (balls=11). Please implement __concat__()\n",
      "  elements = geom.concat([f.geometry for f in fields], dim, sizes=[f.shape.get_size(dim) for f in fields])\n",
      "/usr/local/lib/python3.7/dist-packages/phi/field/_field_math.py:407: RuntimeWarning: concat() default implementation is slow on large dimensions (balls=11). Please implement __concat__()\n",
      "  colors = math.concat([math.expand(f.color, f.shape.only(dim)) for f in fields], dim)\n"
     ]
    },
    {
     "output_type": "execute_result",
     "data": {
      "text/plain": [
       "<matplotlib.animation.FuncAnimation at 0x7f15a4fb5b90>"
      ],
      "text/html": [
       "<video width=\"864\" height=\"360\" controls autoplay loop>\n",
       "  <source type=\"video/mp4\" src=\"data:video/mp4;base64,AAAAHGZ0eXBNNFYgAAACAGlzb21pc28yYXZjMQAAAAhmcmVlAACWbG1kYXQAAAKuBgX//6rcRem9\n",
       "5tlIt5Ys2CDZI+7veDI2NCAtIGNvcmUgMTUyIHIyODU0IGU5YTU5MDMgLSBILjI2NC9NUEVHLTQg\n",
       "QVZDIGNvZGVjIC0gQ29weWxlZnQgMjAwMy0yMDE3IC0gaHR0cDovL3d3dy52aWRlb2xhbi5vcmcv\n",
       "eDI2NC5odG1sIC0gb3B0aW9uczogY2FiYWM9MSByZWY9MyBkZWJsb2NrPTE6MDowIGFuYWx5c2U9\n",
       "MHgzOjB4MTEzIG1lPWhleCBzdWJtZT03IHBzeT0xIHBzeV9yZD0xLjAwOjAuMDAgbWl4ZWRfcmVm\n",
       "PTEgbWVfcmFuZ2U9MTYgY2hyb21hX21lPTEgdHJlbGxpcz0xIDh4OGRjdD0xIGNxbT0wIGRlYWR6\n",
       "b25lPTIxLDExIGZhc3RfcHNraXA9MSBjaHJvbWFfcXBfb2Zmc2V0PS0yIHRocmVhZHM9MyBsb29r\n",
       "YWhlYWRfdGhyZWFkcz0xIHNsaWNlZF90aHJlYWRzPTAgbnI9MCBkZWNpbWF0ZT0xIGludGVybGFj\n",
       "ZWQ9MCBibHVyYXlfY29tcGF0PTAgY29uc3RyYWluZWRfaW50cmE9MCBiZnJhbWVzPTMgYl9weXJh\n",
       "bWlkPTIgYl9hZGFwdD0xIGJfYmlhcz0wIGRpcmVjdD0xIHdlaWdodGI9MSBvcGVuX2dvcD0wIHdl\n",
       "aWdodHA9MiBrZXlpbnQ9MjUwIGtleWludF9taW49MTAgc2NlbmVjdXQ9NDAgaW50cmFfcmVmcmVz\n",
       "aD0wIHJjX2xvb2thaGVhZD00MCByYz1jcmYgbWJ0cmVlPTEgY3JmPTIzLjAgcWNvbXA9MC42MCBx\n",
       "cG1pbj0wIHFwbWF4PTY5IHFwc3RlcD00IGlwX3JhdGlvPTEuNDAgYXE9MToxLjAwAIAAACAkZYiE\n",
       "ABD//veBvzLLXyK6yXH5530srM885DxyXYmuuNAAAAMAAAMAAAMABiMSN/6H8XjN/AAAAwAAtwAZ\n",
       "wSvwWauImIdtWNU9JTi8eR1kk/Epn1Fgyis7JFkLQ8/e4kqfBsJ6V1JtysOdqRLBt/+rGZlgdX+2\n",
       "810JVQCANFShG351+gJaJY94CAleDpj0HdYLjFx9HwaZpUj6BOmovFoDC8Z9wmv8tlDGfwusbthp\n",
       "XgEPejcG14Q+PmzaQUckHZjbHGxN+7CGoGFm9tp2z3QlJ8HdPmhjAl6Vbv/eMd+9q3FHM6vPARjA\n",
       "AjxXz7r6dtNxDlqdoJKkmMn8xK6owX3oS4XfrWzFnlNphdhaGcHsdeZOVDFCNypdRL7Yh1wXSNNL\n",
       "Y4SK7+cAQq+RtD8gr3+5EhaWnZvnQ7rHMaNh8M0RIYv58nnZd1Q44G1f3h+1He8PuMGAGxWLOMEW\n",
       "NaP0xDcytlXYEdZKEmYexLQjmUA+02tuUL5bGdIrr8gSakGJEFnp5c52YAL4JYuLQoUPYo6TRmeT\n",
       "J5Q4cIars+vC3FL3hcfHsNhhg0IXdBGCpHuunxYWyAq5ZmnTZQwWaiEfNB73de3lUxaKSNIto3Mu\n",
       "X298IOb0qTccIgLp4393pyfIM5/4upC5C/Mq7qZqiDH4Pd51yS/9hioHmAxbUSYTFq8cg9HllnBT\n",
       "hk5tk+M6UG4ulnYeZYJr9yzvJXlwDuPe66+34vkJtXziVB/N1jWtPhcqR85J9VisQRPF6jNsAPq8\n",
       "GtWf2E4jrLZX7RN2DdWTJDdx1KaKOc6xlk1jcikH2fAdsBXs559ADt4jYkaC+7xb+0qDN72RR42u\n",
       "3ga6/m7Bm2n47k66tf9yj8sRDYfE9jDNE9Be8KW8f0GoHA+FoDJPfWP4sL46PsVgDBKwvXtnMCnT\n",
       "iQqLW3sYAI2Spz13tJE7AGK6PEKEFrXJdreyQbG/qfTHI+w5zAefPvWb02LYDEJptKgoh0VVJntR\n",
       "b789fPT/4KgUqceHAnyCnXgI5XJfO35ykPeFqTp1u1OL2TpKPcn4HuszMIP9l+cimRsFpbAfYbpx\n",
       "nCbqKM0CI9N3bsUWHkEzEM1MMLWr5ys1zyJUBCGDFrkejQpm2Q/sCPwUnvOzMvf/e4d4BCmNFjWy\n",
       "EUWd0laMGce6nR/bfKG32LTcB7X1TTOsp6aRt+0lwYifg7hoUzNp1OMhhI5IarNWM69Kjs9BQ4YN\n",
       "hOT780CCSlFbnNH77Fnvk5ln1Zlf7GhP8piMVo9XOuoV6Jf3aH0SE8Jx7NspKYlZlVM5z+GqCj98\n",
       "oCBZl585kVkLV6scpZetQt1FprlDLWLAstbRWME146Lu62id6YEvcUbNtzmol5dChPcdr+LvVfcu\n",
       "r3BHJxPifZHHDTILLH2X7BR/XzDI+ytS3B9kTcFXZxL5DRp9b7xPhHCmyB0Chk9dZ+mEbV5dEZOT\n",
       "jkA66guOcCDSOdmlkglZp+F7A0lHH657fQRA5emliNKzNy6Kab6EwDpN7koeuGcLDYROavNCdZNH\n",
       "cawWdyNO4V6N8F48rVh3isG0h5SoG9/gc+MDcTEV5oVsuAjxhzpF5F7ebpdyfELCwB7husrOc6Aj\n",
       "TTzCa9qbhSUJtnUg+n4Ix5aYLNQs8rnd/Rcln3vxg9eA4WerQdZHIeJ9Wk2JOp9J4DZkQN6Q30P8\n",
       "Cc0jUQCJramZwW8McqSYPkwhIujscjygYHSEQ//LFyS0+S4hpMy2Jkp5GkMR34jrNEooZYPgZ7T4\n",
       "hhZjbE9kcGXpcKDakg1vSZaf2WgVJb2l5Y0ZZh+7HhORaqgy5tSKFatTBq5U2FyD9kSu4OR+JrhX\n",
       "6vIBkunI5ubq/mDYcvaI/5YIz2IM7KG9ZdosYF/giYE/IkN0ozrMVnahPwMJ2dFy0GjioqmV433w\n",
       "5febWA718jcakWdaYiw8bZzv1wWi+b2JKBZjIIClaP4UKKRlArQT+uBrf86qYakT62St2nMqLTDO\n",
       "UEtuo/U+fC5S/hljcNzhLFpgo+SQLMd82raSgw3oy7TCtl9hNBfmdY1PVieTpQLI7/oyWtnc37yA\n",
       "cpis1Bhi4DttrKBVINzNEx8beDf5pwSATfX8zGmu1IXtZmYzSH2FUuFVfkDqxx33lEHt1XgHnbIz\n",
       "8RvEVoaQyBdZvgvefhtghxaJ3KwLUvQxGvSnf7/c8kKuX40D9eaniG/eFnsVK7lcXQJ/mzQg4TWA\n",
       "KjsD6d+2kmnwD+ZA4zmw1ti66YnfXEo+aAE838Gpe128DO4Ca4nPlsWG/TR8075Oc9MosIF8ox0Q\n",
       "xAWA7EQyOc6iBHgJwZH27qBhf/oUmoe2/DssTcA72bTtYUHQC404zhUCg//JQb2ff5kWYTEEMXkP\n",
       "gU1AP7AOai0ayulfBmZKNFRGu8vrbLJSAIG+oQp/RQ0/QbRs3bkNf+G1IK5EHAlMdiqCvNfu+ysU\n",
       "vq/Wg7+DGDoJ12xYcI9ag33xeutBowy8rgKoPLIFtBFDtN3QhejFP/gIVPw5hq61CwDPq464fYY2\n",
       "FGrycvY5bZ6n0tk8226wdyoBTwr5wb03cyB/uuymrWEMjqMlegd3W8V2n3IKziZfFxmV4MGI8awq\n",
       "GviRy8OcmfrNpwW8e+esiEvePFqaI/s5qW7pig+QIg01xdZtKnkQYRCpqKud9XmMD4vZsVegslrt\n",
       "AwcGUT/vv85AVC3eMtJyaXEg8QH3BXBGz88cVzdeXuKC+VVMgB2JHhcRqmzbXB4l/PClrG+3DK0e\n",
       "+dB7RdB4Uxi23+rrbdcllxC+mH5qeEiAX6AQvkb+G9F47LU8DhbzQZvuMMjmCvpumtLiqtpv4evm\n",
       "y9ptsanN6xxLKDlLkOS3eBqtzmCzwJhfM4MGrUrfcziH6WjGkEDGYtwa2+3tXxpqaX2EOJt25XIE\n",
       "jmsL+gcGGJjRTj0PCTmP96otcQHsKo35KOrD4qqdFFgIRj3zCnO+UNmQMohNYBX7F67HTVQ2wTeU\n",
       "2XZr+PFDl0jUFvkNgf2QEIpycp+jPingvsXTHYOj0EFxklXtFjoMsVqZCfXg9lc4MocNXx+GCpeh\n",
       "0B5xQQlZm6ZuG+w/W5vAyXxhSeXbQhgaPgCaXxHLqNhvBypdZhzj7enYTnvle7kGjClgdTR5sMwG\n",
       "X70fkg2jU8CJE8QWyYNgxcvZDdalQZZjT8mKZGlXO0I0CYBl3Wkqz/9S77otRM+5FIG0qi+yJ5uV\n",
       "qZR0HreljL+HccFaYtMoSOW+eBLmieGUAAroGfXV8pb6/ZIvTdHT9jAmKYecw3lgSI4XvDPK95Gb\n",
       "YKHVdFSnCwlEeHpcYjFqqTFUkQB5oEUZp9hYbiKR9YHAES0l9Tuf9HCkS7CiOoOF7VPRpy9CCiPE\n",
       "Zd/Ct8g7iAPmvkNUDBHxxtfH4zEWRxyUPdXquKUaQ4B/mQ6YoWvrHD81xDxcmqoZ3YVP7dbT7N/c\n",
       "2nlk/u+a+XubGgEy9jE/IsdISPRIKNQje//yOnKxzMADqW8GlWjqsh5yUERTJuwES8PjbsGpCwtL\n",
       "3uBZJY/Y9KheJe0kYe/GbZdtuhh4iJWv7MkUSapTl9jF5t7C8hvptCRRgiLWiOLN8qNNad4EtEwV\n",
       "5RUTVSuTfuz94+hP+As4zGbVp0mNAw3l7Cy57fJvnkpFr+XmX8Xa/A/mTNZIRMUCYBINpPtAoK+d\n",
       "YcE9EEPclyuvVy8x9VelG05+R922lGziGkjAs0ukOpttuRxOw+QVEw0P/sInFkP20pJrkCPfoPlz\n",
       "9tb6rhzEWfbZOHwj1CMwUmXm7rESSeFHa2zHQwn1ZYtlRkHcb/kKUr01p9S44qai2iAyePbmnYAE\n",
       "arcbxHlaIAoUVo2gbCg3XMcmxswIMGwEYj3f0k5ERvSpPF2/WD4MZgp2aJMWXIyDaKLZxE1KKevy\n",
       "wf9BOMLegfTUUfBv+rAADwBK8zhVWxZA+eMuF3MPrc0lfmV5hnibi/DeamRNv9ebTKizFp7EnARS\n",
       "4RcXv2ETwYdiV2odwoOGsU36KRJZwicqks4HVrAAfqb3sKRGXk+ZKqGyTTlQClXTMUV/jxamyVhP\n",
       "cfCCY+OYBbvpLEEb4XeW1jEPsLrxty8AFvmL7RAaqNhjeH+oPtFO4m4rx9+6s1JnixaR04ZZ/5o1\n",
       "u6Bk/akGfQtJJz5QS8VFeLBH/up6ZmUiLgyPupZUPGE2+PPr9Btfq/odgxbp7VNmXx/Az7vnSMzw\n",
       "6kbhRfo9azqXn8JYm/WZuBIhq2L2Iv0Io0SXV3yv8TC/RQ2oEXAyygRWrLcISx156xZBEfAy5y6Y\n",
       "N8KgJsEiqxvOOOqZXBkM333KcnV+1ZmG8gfHRODOvcdYB4ygCFuKGTs5gN8PIA+EWJUVNDZDy2By\n",
       "rS3pCIWRRRG1kxw/eP+0TXfmQsLrlIxXy9QVxSrwQoEXvXZwdEisALaUOq9ywXtPTI/ozp0bpS2E\n",
       "Q6fYsPlfq2qxfoN+U9kJeCOmpP+DmBcZmjQLf4IZeHnNdimqKaRoxY8kYOf7jPXhN6on9IPClvE5\n",
       "FwwHullvtHnT4a43GhiHJhs3PJEmS9DROXpEUQEF2lRic7YIOKVQudKfwEwQy8IP7tc2YnNS2KJI\n",
       "Z4WyZnzrZoYB/mg8ocH2z68wcWfAJxLUtqzCmJa7HOWSpA+lOeSYPTyGpj3i9bAqNswIiGZ/8ko8\n",
       "cIr9UFdNgK5ref2vw5PEjq5RYhU5/MG7Uw40PEMt9D3dk+NON5SHH0NK3cWcxyLf29pnzT2XC8T5\n",
       "iKPG4XAhVDMX5RlbDWrut0Rg/N04JFgVnSauK8ymqv48iASdkgBm9W92j4GQgx+IvFtjo1s2lmCL\n",
       "I2LEj3fBPJBAMRKuk98f2rSIJQOxIw9DAe73vH+LonWu7amA/gX/ubVg2GnAef9r2gwkrPsc9yuH\n",
       "Kq0sqAR9jL9b84z7NiLbDjeppyYGFRkqjZ0xTCPCF2bVDGWPT+/owCAaPWqC8NpK+cD0wN7NHFx1\n",
       "GiHYFQA7s8a00dgYPVgqP/5RETclgoMpTrHVedulqUglKlhT2jRM8NCDJMy3ijNXyVazTINjOUop\n",
       "rbWyhjtVM121w65s+hMjnB8GaPcdVJFu+dco6Lk6yTFQCY+6mmwSDTUjJuXOno/V93MMqcSz2nsK\n",
       "16K0MsqRfwbSrZF5ey4X7gp5Mb9EmXWYBVl4WqGJHZnF/QnHKviyJs+WtvYVDyR9w9+JAHtM0BwZ\n",
       "FdiiWa4AiScl3uV3Kc6QisaHQnUnQxNslxtGNOYeYo16mmhOywtyZcaQp6Gkni6zDLhsL7halBxq\n",
       "u8e8eMmVYd+CpGcEKBJTOyauqe+pJSzI8Ksy+67EC7RRPFERvjeMBXr98i0XKgZU7IF749h+k2wg\n",
       "kwJ8jGiP/qe2WOQOWrheAEEZvVxKaKgrNvcgJKHfm8Hp4sGbO1M4Hom79tZEmyD7uKIo7L4mzu6M\n",
       "3qyc8gJj6BuDgoL/D0C1LxEEM4cZN8HVm1yRAn/AdQKpz9o2zYXjUgL91Q2LNf+qO4BOGzc4Idry\n",
       "UmXHhxuoiJfYw7csgnB2lTYsG56mH1P2Y5paSHpwnecDxsDPTbeIScjE64qPsz0hAoiclup8ONxE\n",
       "rSd7b070pEF2cGZsRsIFgfoiOQnZhJI6AOX8J6p6ZFROTz146XdQQpOHYksTN9htYCptg2Bh8/ne\n",
       "pBf4mHA95Vhn+mr5TDDbhRWXPy8I9c5B+7Jdm5c2/FlXF9GAy1oV2ioAuQ9QGrx5A0gnK0RYG9Uv\n",
       "7CNuIkU4GJgBz2GCr8+JFdEtcfNaAXGjt8riHOJgEgmo5nemDZafLe1dR6UYK548P4Ii/4R9caPC\n",
       "j0hOOtb+jIjslLLKUhHnWny+t4DODoE5LNlXtjYEDdxXSQ7jFP9igvamRlTufQmSnORYS/mLIOP7\n",
       "4L8phaT3V1oV2f+h6vneqaG98kSDcKZs5bt+3luZ5yUeRu52EuAKBOdkjYaaq6wGvW6m2Xj+/AK0\n",
       "0+LlPL7MwFhDKV+ujHyYDOPr8iV8SMYRnXd7XCCTA3A+gDjbANTt/uszAuWJaW+UHiibb0Dhka+I\n",
       "lWHhZ5Qrco6Onf+9QdtQceQYl1Ozcfx8P3llF02EW8XOh0HkAxux49TpbaaKge9mXQDsb61UOlZW\n",
       "pRDJuJAs7qF1wlFZvqNRQN6AoYuzjctdKwwm7MUw9IkzdC51TKLLZU68yiIQwPJj6YPC8E9wWV2M\n",
       "CyMfRSXHC5/3PuYfno5lfkFJj4FPNFbwrArGGDV+urpHOEunH3Sp9tWFx7LQMdRuBd5Uo9nIqSpI\n",
       "nF7Gir2+lk9A8oqpGfm2+NFnO23i6VAI9Slw6NgmwM1j/h8yNeTwmdSDTr/Gssg/6she9E80RALf\n",
       "D4l+ql3gVoAFURNi3DcQ8iPEhTfl/Pokf5Db3ACxeVJV28SJtcRoyYBTACMCuKxM22MZcN3jqbu/\n",
       "7MUhBuiBMOYX6cOxFeEGIZPIt56exjRYuoNAOFJRucrtKgDfTuiW4oajQOmVjMoG3Ien4hyInZ6X\n",
       "gwWoz3gXZHL8pb/YlcCQMB7wgJG/h6vzbymurmxTbxJ6rVUPCEbzTIKuTHZgJ/PfMRqrmOUwf9/m\n",
       "X+hSRyQWShoKS8ba3HR3A+84+mDus0Ny8tKva7R4f/mJBsYmbOnPp6TRsYURw/SNKbXgtGRYrl6P\n",
       "EZm+ywXGZ7+LY3lmXKAcWiVYq2gIumdbD3y4/HFdeg2JWcTrn1+pQxyKo2TtkusIfDZVU19blkke\n",
       "SZMHxUod2aKUjWaf9JNcdGYm5xvjbK959VUxl8mZ5RimWs97LG0nfPxmSXHyUythYIKvwvqEN8ku\n",
       "gS3HXXrlww7HJBZLL1HHBRxjgKot+4t31FZEiXKDP2dg7QRmh/rTdqrq9Kl0cV1SlGzygX74B+DU\n",
       "ZieuXvQPAjJYKHOI8MZlBePwAH0rW36p84FZIRonX932V/tsTEvgEB4nAAg8pCi4AySFkqaznDyv\n",
       "ZWEn4WT9/8mqIRQ9Nws4qK/wBcS9JF5X6Dp6qRst40q8+1Z83R75MINAyqihsMp8QYVSzaFnHxwc\n",
       "M1TIiLAnm7siChUscESoUUnzHItZUlBB6yjnUwsLkO8Ps2yABmv1Hm+YcyngKd+5QnM+D9d4RITN\n",
       "HjGqiWEvb6t64UqSZaXBj47rO1Do57Y4XFdacsBy+RFdF6BFtcCdSF/dv/YjuYbLyDz6X+9KZ0gj\n",
       "8Kvr/8ERucN0iSpDKaAS29JQmAIBf3qnxdcYPZAtx3+mDty/2mm9UgED/xvf85OtKO1qDKqFRHQI\n",
       "MvcRzNdLsuCj+lwRJmnHajYly8DHeZF3YD65tnPXOSI8VbQHfjAe4iMnGpvKxon1Ig+XxU7kIkg0\n",
       "zNCDETr0Zq5HdCm8hELjKIoR3Oj07F+Qo1X+q7PsIrVVcfQTvnM0uCoTsM/L161TP+0A1Gk20xMA\n",
       "QVct7QKm0Nkm/uYgzyC6WmgJGEMMBNXhexVS1u5iU6qG/n+CpTs8kKwPj0JygrCnv20Q6hicUwlx\n",
       "XZuiPiNQTAY4Ea3yXEgO5NedoksxuEu64ql6hENW6N3uTyPy0+JP6DrWFsUfCehq9Uij8l/DQCUj\n",
       "4th3mhNbv6osu+++34vu7UDrdNu4ErmPDRbGz1HnObtIgRmtBx0xdRzedQQ+y+Edz7jmMjJNLNiR\n",
       "H//KlztVcu7BPS9dnCwDw/pkjqmOgUqxfc5GggFU61BrMqXWe+CO3dgdE9OEdxRag1oWJzjAkm2F\n",
       "V6sYjxUwH+Ujp956Kln3kMeEFZBGYLKGxUliz5GwZigkz/P7ucULWsCDjOAfn3gT0UcVLNf6LZXO\n",
       "gCD4F2fkzxrJKzzSAcnn0fI8yFWfw0qJU8nsWRfauhXP7MzZy5wlPcgyIAXi+VFeyg1E/4n+RIzh\n",
       "S0ttjoJXuTPtvOu/O6v+fE0c/iZSAoUZU+KrbhdjV/1Ljl/Y0JK8Ae/GBMIcyQLx6q9plhNuzH9P\n",
       "+nyZ0cODdWBd/nhTLj6QW3TNHlBJrROZ5fPYErZtjgqxcgneqhCCVFEu711hiu59vBElrTd00cNF\n",
       "l/Kg2dZE+R92CxpVFJp8NQkEgA9PZ0/N4kzfcw0zNy5PqkiaujCwcxVWmimw0KQT/3RlaIuiz+Tx\n",
       "skcuf6i3P+aZkEG3z/UVvE3Vx5TMG9GAUbjvyb5RRZOTBXY3aqXR9o7CT19X/cdXWbs10czNob5b\n",
       "tfcRFV1Rg6wgLNGFA9J+LaTOEZFlohCCJQcnf5JZNoD8PfLs8CM0PYvuG+Yw9koUFnutgS8XmBtc\n",
       "b7cFBiHEqbqULsyMwzxFvxzSvNvY+yRFGJho7TDiOl5bfGefgAoUtFkTvm0vsszvWIpylWUVM7UO\n",
       "T7MlsIVhVWSPVtIUGUrllKKXBz6dw87hH1bOXlMlznnsDxbpMiKA8+ZRLz/21A5aCnfcgWYy/mnZ\n",
       "HIAlMIuRhv1m/FKVNJWwYtY9StAkhcNcibgK7EAZp8dmnkXw1kS3O9FsEaFxSODTYIhKP+hEz5wz\n",
       "MlxJ5b8xoMZHhybRsjhJ7O9MtBa3o6/eb2BKs/NnOQ0kAFlNRoe4DLkB81Y98GLyn+3/s/RCkUb8\n",
       "1J2I1OKmt/87wXZKq/dOG90db7+C1KhXBuv04if+SyO9Aenb946MrmcztS1Y2Bh813NY9KZMaPWY\n",
       "gLSj+XGIapfo0W5K9dqk4YnRrFqSm5f1m5eTDMsweDBLd//QSSLRDzZD5t+v11VagmootpLBhmoR\n",
       "jqKtWBg2sewyAT/TrqN3hX7nV12UgykZox38pNXDSDlPGL8UzrAb7s+MCvaFuh21ErSkhpd8Othu\n",
       "JDFch8HFThak2ZschvDDXrvkVqzNGqsOOiqL2lCweMbV5nRSRvYiwx/X7zYBzuVSpy48I8FulIKZ\n",
       "qUBG1blk9WgND/JWfodKWJb7x2ogkxl6MavAf8AO3xA1t4kn5hrx6qOD/57Zddj/mP1uPpmp8I1T\n",
       "+mcyNSHh6NK9kij1lXrRHEssKmStHtYnjyeM97vWVrFQmeLw2KdCUij8aC65rfJ2CSTCMmbSQad6\n",
       "xsV4CJYYf3/ClztEAAGg8izIfpzF5UuStu2gXmX9vSMo1i/fk3T0CAhO5VncQV+wupwIY9EjOmtM\n",
       "uBNTbYXe3/LDW7fOAMnPFXt3YjbhlbwVVEFPkiV6i+/wOUPZlXZgtGuFRemMK/s37KB0zJL3p/S7\n",
       "jmLjjh+j2WEu1+8nwShcDtgeNAhgiw1aUVGpoSAPhqMboVcpKKhvvJ8sWBLQbte2y/lIvEn14OQe\n",
       "b5Z6JOvs7RPzkwEu0IECMqQLSPvdT3gUH8BVG/5cSH8AQ/d8x958ueGTSSzMQkYVnAYDJottP8Fr\n",
       "yi9cmCKKp3OTrcVAE4jGnsmfsdA9Tkt38/QQMnfxMzxKYOaz52GiXaYOrPAAAAMBkzf1MVenhQ+v\n",
       "lhi4ZKyfZaeijGcVoXkM8ZAKlyvCsGTreKKZTJYgNpq3a/s+ENAxb7pN7//OmqCBgbQmvhPF5YFk\n",
       "Swe+q3LyAE/piTl5WcH81t2OZXJMptNV0oM0iIbMHeeYFAqyc2BHOaZxH3pkC7Y0uzELBkEtzabu\n",
       "M7ALy3o9y2TJGTNTx/j8kYYFSRAfIAAote0sYZpIvSdxdvWoCJNF/OaI549R68w//Js2vvN/IPMq\n",
       "kIyG2oPVdjKZq2MZ31itccUBUjq+QsUyMPlHUMDeeX6IAAI43e+0wt5WrfdN301O+nT1eIDlhZ+A\n",
       "TwUMzleWT2L4iC6KHWB8+/i1p8EF8ySrztDvx0IdLTWWBh5CwbP96xIvkyzXnYOXnwp0zv+PNrNG\n",
       "/qPKgAHo/JxbM6Y8V6GndRsfhdQI4tG6DwvQMeXg8mmG205dZC2DlmWHqNTk1DMFTxYl8+3RqJPV\n",
       "DZx+Ks8Xi/MWK5ouCbjtkgHq166ZPSkGUY3rPq7flFtNmN+i/yM939JqlpXG67USgZ6zuKjVXFnz\n",
       "f8zc1VfgpRVbdELASq/Q6sjhgQYAkXYQHGG9qHASXuAX6q/u08fNMQQ1fnezZVryxUI37oSuBVeO\n",
       "oM1igqc0BjSIhzsT5q3slvNqpGWAB0B84uuwDoCvpKGXdqmI9zSLQ35C0KL03txQOwTYWknwkH/L\n",
       "ZLps0LlhOq+l40r2MkNaHm7kWwz8ZaaahcFnpyii1/s39zhwrhSFWH5WvEfXG3XzqnAbrmmDLI3O\n",
       "zZEXwuCG+50oJflToiLfXr72wUS8e1hZne4AK5xeGBmcLdAGEYa+5JTFumgnqLUAMyjbWwDfAjB0\n",
       "A4gckDGwb9v/fQ1Xmt4Je5mAsl6w6bk/WKUCyD/s+xFo78529RrA7XfvegUk23gIjQOWXBrb3HI4\n",
       "MBIKANXLD4avqw3QyNMfsygsQmZO2/ghpQSz4HSZkubkkmVBI6sraXJuVUkpjvxn8wk3eDZwIARf\n",
       "wZmK4qVzePqmqMWh92tjjT/a9Nwa0LxXf2gJz8kZqyi0Ozo2mzLfKiyS2f/9a+hdQnBAkU+uaI6O\n",
       "L1AjAYCMgbmRbGYBqJwYOzCIVIHKfZlLjJ7vE2s3Qsf7VPXDEDDn6VixfkLAYIYKp5RgQojq+N2M\n",
       "lfjifnU32BIxiA+ljoyWr3z3qpvRYmKB9VvavAYPGYfXJYvP5WvcatVb/OmTPLCA0WoEX0b61Uw1\n",
       "6fl2+5aoOig/j2NkDdPWwscaMwtvOf1Bi0GAAJXHTd+VUZFJCySpB1CMxhA/7P5+zphWiO/05mnA\n",
       "NbI5A/QUS1Mh2rsOH1WjY4/0q08y4lFbSx6rG1rUWI5qkYDix2LmbMTN2g99yHWfHq7DbKipMZfm\n",
       "JCd22nNDJmDVVjnQDjRfgOCcnRQSztLCJuEAkqRbeX7Cm00OCYHyxaFxJdAAoJ6ITGKOdJC+f82s\n",
       "SRytkWlcQJKZ6bsV3JjPiJva1mEtmJ5nU3NT4EOcCWyq7ywWFvpKZR9ZO15inUK3siSIU7w32tSp\n",
       "l9MGrPUIancwQWDIiehTiOMHGgTEQAkJvpa/Jth+mPOK+BQAALGTsd0mw6isV0CxpZjZpAagZ3nL\n",
       "oJWIJ9d+QJQkhAQAAAMAVEEAAAHKQZoibEEP/qpVAANRlmYA2MGdl/VmJC9Fldi/9vgOuXKMY3JI\n",
       "iwMipjH8VOEDafqIwWsuL1o03P+3b2rZNU2DfDEaU2CegUiwMVcXd1JtdctK3KTZ1/9A7mfdrVd2\n",
       "CNvN0qUJR6HcsbVXfZemFlQqau0VaQKwKVFEH662b94uwypssMhJiiCF/73KqvVbxN7tDL8AjzmS\n",
       "Q9S1j9y77iFhO94C6UQQqsHGEdeAQUeu9WSGIP8yogCTsMhojRBb3HMmIc52vk4u0ZzjDYfAaSer\n",
       "IB8qGUFxNS6itbjDLqikwD0xtVP3eq1AD51vQCeCrW3J+mzhr63cXMHz7WeF9J97ITa++KCRhy6q\n",
       "lflZTki/+iquuWrw06BUHAPERVs+ImrTPPaqV/4dw2KROKqXJpoUI1Z1pEOMHMSfhXSBmA70OSOv\n",
       "2kZm4V1U18K+grrmPZTEduxvCXoseSg5f6L7fordhztRVY+0XEBz4n6eTv2lg8kq1/3jGJ08J/I0\n",
       "KHpB0IT9QTkdooMGvSf4DLB633im7TAL8MXclmTx+GfzQ3wGKOP+ZO0evX4Q0JLW+BoKjTgIyjAL\n",
       "qRIkyFvGpdOe1PbZGZTBCoAo0qr6hBIAAABPAZ5BeQ3/AAksZspw6sscZ+Wq6DUO415LXIX2N8gu\n",
       "9xurrAAAQ3GZs372tHEDO3Iv7RTfmQAQUI6Nh+D8yGsx2M5dNxrAGCy5K0zRteBiQQAAAIBBmkQ8\n",
       "IZMphBD//qpVAABnsHIAAS+mP5EvO8WLakuu0T0d4q6h+Ryazq3sVWnbHYGCkFdDN/1Xnvg28FcI\n",
       "mYY3/6oUE+XAuGjgNp/5XL9iz++FXkctsXWIv5T2dRWPdgvXBKoExo8fZH1S6vC9NIYQPy/7pBGh\n",
       "jtAtWq2acujcqAAAAEABnmNqQ38AAAMCSxlK7hJ4/Ak5eF+DKpPLhtFltrQmACG4zNm/e1o4gZ24\n",
       "2VMX4ve+AWoXhVbcUKvrMwD9ndLxAAAAfUGaZUnhDyZTAgh//qpVAAADANB71MVxR2Dg6BCAodHp\n",
       "+cRCa+joVJ/N1NXqcAqba+usej/3/2fXFyGEgEGiQN5s7Ev9zQbOdyFtmtvXZUGbpVCEtNSxjg87\n",
       "wT69aVbNkawFeh8YSqpjRHz/s1m63flztKOdimukGQaxKjmBAAAAUUGah0nhDyZTBRE8EP/+qlUA\n",
       "AAMAMZ8c/n9p8VAkJfo5x1soz79X8pef+3JN/9oIKrshFLjyILnz0EBlH5YCaX0ANu8HeqxULzy6\n",
       "wsEp+fvOgwAAAC4BnqZqQ38AAAMAhsZHhIyzNZZfnF/0107HEgy5xxsX/xCutSq+gTI/AAc//dDB\n",
       "AAAAZUGaqUnhDyZTBTwQ//6qVQAAGypA4svjWfuNP7057uZkvAAHCXwZ8gxnkHd7TAZs4bxL2g1V\n",
       "Swe+95B6NWZpuFJf+LPkpMwWw6WYjE0BhNPfNn8z0a/1MKnBpQOZcvZtaHTJvv9UAAAALgGeyGpD\n",
       "fwAAAwB+9eIqbCOqpIqg41i/wIToruTVlBDt0m0V4Iyhv4HlLU0RkbgAAABSQZrKSeEPJlMCCH/+\n",
       "qlUAAAMALfzz2Nlkdm4f/TADMtiLa+Xlv8gRlrqHTS53Mpb5o95kkHUVIIDcUoAnDMKrjZ5esIKZ\n",
       "ksn6iDLXJIQLb1Xr4QAAAGpBmuxJ4Q8mUwURPBD//qpVAAADAID/bV9VYVnCbAeV/FL61eN2H0ym\n",
       "DuoFuQAwqqcCvKLHViJxFv+fkCfSZLEBdsFGZ65Ybr+nx20+6iF1rKp/wJ4QhAR7VcMENxXuoP89\n",
       "jIVijPNj6RIgAAAAKAGfC2pDfwAAAwB5deIrCbVe/CD6RXaCkAVO46Ij7dOf1EG7AB2lg/8AAABm\n",
       "QZsNSeEPJlMCCH/+qlUAAAMAK3yjMA+iAmnkZ3w/EaqamviCFn43lzkKRYSeaojyLM67iCaSORVy\n",
       "oU+infdoMnEc4TQ2F+Hek9VnP8msu32vqVH9UgY7nYtQjUwvDDfRbz1ErdWxAAAAaUGbL0nhDyZT\n",
       "BRE8EP/+qlUAAAMAK78Xr1thwpSgZ7Nwb5jjqY/q8ZaJsDtvPy+EoBAKFlb0HO/7mabef/JT1XCR\n",
       "XWxVUkRkFGMseWWh4OzwnETnnRucDxSJ6Byk/lCwMh50em/NX1xxgQAAACUBn05qQ38AAAMAdrtV\n",
       "hIyzNZZfqqTKfBHHaj/TFrCmzAIJGMPhAAAAZEGbUUnhDyZTBTwQ//6qVQAAAwCAHzZEFTxMGZ/M\n",
       "11wL283AKYnj923n4mJ1Zx9D6RxwHHIhLhYn/snPrUW+nqK3ojvehzFLyLPEjDqk/7dBvEtU2SM+\n",
       "EtNpTu4hag3g7cGeYYwAAAApAZ9wakN/AAADAHEbfpKYW72KfeQVprQM0CLbdhN4jrcWUAWsIzfy\n",
       "GHAAAACjQZt0SeEPJlMCCH/+qlUAAAMAgB80yO4TsfCSzl9MPxD70tVV7MwZMX3F5Q2MJorzzxnY\n",
       "GEU22FiY8hPvKjGxigEF+InXomzq4Y7NDV+H0Rro4boYS+gplLr6iGDLvZ7qRjcC5dmgRLRYgnPf\n",
       "bXB04RjcyuOfHTc5antJSs0yBvbs7F56+uls21/3X6FpIaelMnJKzo08ybXMIw+IkRotEMNhgQAA\n",
       "ADhBn5JFETw3/wAAAwBugA2qalLQ/42g0Z+/p07AgXSvK0gCNlxSMAUqNXK4xEDRdmO5gdjqAlAt\n",
       "oAAAAC0Bn7NqQ38AAAMAa/uQLfD3n+3pfmCkwX1MBN7l3112Ws+Ff5tqQJLM0b9x5oAAAABzQZu1\n",
       "SahBaJlMCCP//rUqgADafQKgDz8MG1g/YB9GOv76scQkVIR3sI5+2Xr0jbaNfyw0yvanm0Vhu7nz\n",
       "z2cEjPZKPVrV8WD3rjeNDo56KA6f+ORaf5rGeDdbfSCxdw9gjuZU/iVdZ/fIB36WLfp6HHSeVQAA\n",
       "A6lBm9lJ4QpSZTAgj//+tSqAANV8/iWsdoKDs9aCs53hEBG3heulW9voL+UfcGHTz/id4mYCaHKS\n",
       "Lzz1tPg6A6h1d0v032bqnCJRLwY2w72no4Eg66DRV7HP6p7T8IbMUisU0iDU0hyH1VaEBDVia3Oq\n",
       "9kOiWDngij1YGKbtmTpiY/b3W93gwGGQnYpEWKZdabl0gIKcgXsTkpqvzugwRqWSnMHXv/CcB4Cd\n",
       "oy2cxNGsOnT4wCq3wqu4psynXv9/W/8Drq+xhWbkrolVcYq6tb/ZjMo8A8xMtO1ZIQrMn4fuFoBB\n",
       "LpFLj6xeTc1QPXQdcdo1ShdzgCshNRD4l/yHL6UXgtekJ6eahBMWaDyPz/YJi57FxeIeCOXkk40u\n",
       "1FVINp3tTjtXhqrZXVdDEZgdE8K+9/yrTwmHws55nG/picHJb3sYMwi8lQixxr5TqF+ko5H+shD2\n",
       "K6NwD8vEx51aqV6k7d8azw9AqeOU447k9Vm2o2lJM6FIfAByw8SQ6lVcogk2KpxQztpcjBfrSDi/\n",
       "VPwM3J8sWoapBpxuGMNzdutL+hKy+i0Ufqzn/pf98oo9PmzdeQvAXG4t6RmQ9EHJ/n3fWgwBwlLr\n",
       "ybCIwrSBVdC5qEzNAKkgiz0I7ZniR7eEY1g0GqetgrWfuWX1aguPtTserZocUEVd8267Pi2W4rJx\n",
       "riP6lkXXfCYrRIPwEdsXSbSOLbl12Shz31oHkvcUYvECxs95ciB2sl2YP6eVEjIaVSZgMDXqHha4\n",
       "uBb1Hl77Hi8t4nYtjCAj4ryA5ixE4kIx3/W3ftSKthGPiyL7R225kZbk+kMM1P4eJ6nJrhI9Z0Mi\n",
       "ZU+FiOvCRphSoCNiiiiAIgklYkFXhfXHsL9YaakVqkx8BFLEtNjGaCsbeZG9Ds2hC77T+kFPtgQJ\n",
       "XeEx0m3mxIG0vsNv1SzU1RrvW83IJc+fyU7KbQw+g9mBWN0W04zC+IqV3s0oDO0mWl03EFM8Xv6o\n",
       "Tn8K7YAQFuA1OuFiPTrGIZioy/hQKy5CMP0GHL73BI6MHL/ef3R3onnwzJ6+I1ft8aEiHRJXouTe\n",
       "OHMuAS/cf8o+PqSK9t/46F735uQK3L92c5z+qhAcGXr7jNj0Fa+odMC+e2hxfN0UjVGbkeAxHXQY\n",
       "qXLhOnSkra9ShcUzp9s8Rkp7+Nn0GPZ/Q6vIrdA/uvvKQxavqEXn4FvkJpZlJwaf/Obf/11bfVKQ\n",
       "M3KnrCfRTRqbW/CAQmWr/s6/sIfzMgpISKdwAAAAUEGf90U0TDv/AAADAXza81gfoR0K61Xzsfq6\n",
       "zwXjqt0Y1UzIYprbNzjcL+GywMNjvNRHYIjlUwrJDpbOdVBASkQxxu4TYT9/MsAAB7i1CprZAAAA\n",
       "LQGeFnRDfwAAAwIa+xxbQ4ZLGLLXzcd2QgPy+0jyC1uAQeykgMvgVg5JaeAPSQAAAK4BnhhqQ38A\n",
       "AAMCG17Y/mzm1ZiteW/BA8bocOBjmS6wnr1MAGygfZJigcrbWDEdK8GmhZ1jWg4LR5bdt6zkl0fh\n",
       "NTWou2HfhKjBzWDt6g0SAnm5aAKIZhY2VWGhzQaLXSHLNr5Syu790P3piHTDtm9FHTTOOXMnxB8R\n",
       "9qSUskJ9z3q+JgswgzGEZOz7fD70rshkHUq/+eoWF+hrsnHF1u6yH6fhhLPgDQX2y83AH+AAAAPp\n",
       "QZobSahBaJlMFPBH//61KoAA3nBB9QBax5dhMNOcW/VZkT5bbCQmweFhNEM+42/tSVmyAtnZyNkl\n",
       "BIyTEr0DLP7WZBk6pueNLVliEQFBxqAuR/DkzBbCb4o0tMzkfkYpjG4ncQTf8CUtIjtbX/mBhE4W\n",
       "rFnsTzZXcjC8kqPIHoSUcX6WYz4bSzrLJFGvTJt0KwS3PoG69TsmTpVxZ0+Bed7fmuqQOpIoIBWC\n",
       "ai6CylY7MD1Vccdgjyp9eE9EjtVfuRD5oT/xQFS0HUemKwBCSHLHWxn5wHbfTNbyMXOV93b8tRJb\n",
       "nA09W5n33yIt+FwxyweLihe43onrd/2JQm2ULROaHDN1d6696g0QFXbXE7EUBCKDxAm8kxtjNzS3\n",
       "LEqzDYFC1JJFQ2SpsJPEZ9pekVWL55gB5UTyfjZ53XzdPZ3qOZCNnOtJvZK6ow/C6QM+o1K4N0bJ\n",
       "2EqTgNCY3CO1k0xIyEf/srmWXa2ajuO6J+9NwmMC/mPVAHqFORUYgP551bSEkc7dAI0NMzjzhG/2\n",
       "cVs8Ic5okEAUyKA0LfSvePzJT2G6XfQbl1BRsK5L89Jb8uxOlvoxaJj4DPGibU4vhkLwtgc9osdf\n",
       "FJsTBm7mQOKZvB8XUlZaMvxcOg5oO3v2T1UP+LUiJLBexjrQA0tr+gxJ0VpqfxA8MZJzt3w6cAu/\n",
       "VrR9WHJRn/nVZ/R1Ubf+aINvErGiPlqrikhQMrOBBOgbsrPiMjH+pWx2jKT+T0NeueXJs1V0TPkp\n",
       "jkbxU+W5bA5fEtJ1jlL9LiNvp0chfCjsXzz8E1jz0kIwhjbxxOvJrhmM6T3fCZA7/rOJ6XePl7oa\n",
       "T53Muj4LvcEgffWdj2fmaElGKe/QXQLGpIhecj1PmxEl4oN9+CvsQlltHJEQgelM+DI3Hxy0hclZ\n",
       "KGl4ekSw9yllJ6Fa4hMymz1AvZJW8MjMHS2du6SGaYqNNxfHHt0Un7KGlUlmXKzoWI8B+BS4tY8D\n",
       "/By5Ohtg4HYuaxd7YJfRqrSPExwOxJt+hJy8/PyPZxCxea6KOaO/xok46dIE2XrBDXVN32od/+dX\n",
       "CD0+5243muVjsM++G1j4vm65eclEHB5ef4/HBifnFjLf88pjiRviRW/5+YOqhlVOScvbw3qOyKSP\n",
       "NlBsSK9kZmaqF89M2LhjewPY0pNo//8mNHpi5tQ15mC67m66UayWfdMuVF9BVb+VaeXTzValF7DD\n",
       "4jZas5BxVvR135qkQv7oryQ8uwRF8Lp14W1FkGDGzvD3GfroWAMC7GxcNCKlhuYQ7BzOXzSI7rnm\n",
       "w5n9VWE2ZChwieZi6V1oCigs0QKUOlu8y1Kjcr06U8EAAAEyAZ46akN/AAAFigLqmUAu2Mf8C51G\n",
       "7AAEP0Jh2ZVr9lM305RBg4nv/Vmx941DnQ1cSZ2eq0+xm3mk6zY0h7wAr/+mLNA/ERwA7I8jY1uZ\n",
       "/XDD3A0JqGjpYjJNL9du9gb5Y+2f9cW7rJ2pszPrQgq7rYWTCXpX4zhvFFlDyJK6yDICI/5JoQg4\n",
       "QFF5Yhphe0okOCWFIoifKR3ztRxyl5ZXP2wyyfpROasCpOCq9HW0TGG4OSVY07O4IGuNWbxIKZUK\n",
       "IFJVs8ND4KvLGO8bl+7WReqzvtjIRyFUxBq+AW8c6x9OsOuLqkdkV4MJFfDWmskP1CDM9bBYgPB7\n",
       "o8FKxghjgmFb6bNUFg0FSsdfmSCDqVjM0eIWbhasTegX8s9eEq8rYm3fhsXcSKdEiRS9yvLOSidg\n",
       "AAAFTEGaP0nhClJlMCCP//61KoAADpN5NjbuAOkEWIkLIGaYadNG+MezSeD3gOvxUzHV0Yop2iq+\n",
       "JEzlp76oR0ctPP+tya/bRPmQ27TcFkUIe4Mj6C8aIh2lhy9AFFUueLncuW3FGAe/z9nXs/l9D7ht\n",
       "E6HI6IOmz+mBWm653vN2hTKLz+moEp5LQG0Xm0hwWiXR4yoKvujSoft+b5Lkpem63/qHZJpz7AF+\n",
       "zkEKqfQt4naw+1lwJRCvMms5QH/Sh7Vxxr98FjHJNZXnuNNXdsqIQTQwrWffweq8TUV6rUIRf2Jj\n",
       "mzGeBoKIAtA8p2jMi1mNsnxo0FsyO+tDecs9MLwUIvGWi/dn9+iAXF3FyB1RrTrTFTtYD9/fHcsM\n",
       "uwFi4lZ6i5/ke8l4SvKU73Xqp8vvhhGuqS1l5GNEpN8+XIzvMsunqyKP/YQ8Najf/ASxvknSAUnx\n",
       "BK0DlukfnhixbHeK3jRip6P4V9peErXJAKAvneT8yhF+8eOW2jtFh+Ct0q1f0T2wwloic1dn5xwX\n",
       "LPoXzR/RhRaBPCMM0qr75NpdSQmoeRM8kusKEPrWqeTigNv0T3isqumIZQ5rprDjFvqPb+mEsuqA\n",
       "Ce4rtagsAZ+s2zudiGwm0QPfcA0K2Rc7tOeYqC8FTQ0soq3kcljVDZszGG1IR4J4xfWeb6f7yx0/\n",
       "9FXmrYvQ3MJc5hCvWiGvdIBHZqZBxlZWIhateMArlpJVIHXygMlQZesEgqzMwsO5hXjHx4/f/hXD\n",
       "LrEAc86BU0kkn5sWZiqoofo5UsguEBulzHMF3I3cOF79R/GMfSXZRWA3n/AHALoXkaJ+RSQtMwDK\n",
       "amhoP1AeqffqeJQej90wwh+PVdsAPrEDDTPU1fhie6wPaFLA0nRvnsY3/QyXOJYfKOAk/gnMk0sq\n",
       "0cIHn5+BDW6TJuWe2xZHjkM78JvztMSbysBQcIPwwPFW6uXc54ENc5/6Omrst/6oK3gnXvWY6xtH\n",
       "fAOMPNaqDrvngWNP61BLx+3A1Zj67LYQqdb5X3v8atyZgOh1p6suayQJUGlH++TKrW5jKYhmUKrQ\n",
       "9HyCEmsyrKiTG5ivBxHBEeAmI9yEpUIkwYRy6v1P5L5NJiXAMPqgSbu6m5TfQTwv0lwzNOSu9mtY\n",
       "momMalkNXdamOXLSlrG7k5+U30PzjvOQOJFQhyx4jejsAN6m2wuhv9uGpjN8TzVPKcBEW7rxceb4\n",
       "MzzV6sjqhPC+TnIDzTAoBDfexs6V+rCGHG63IsW/FwzCQNi5Z8dVtMC98NuiKkLQQHBtsUx2iQKv\n",
       "N0SJmAA1SZwutuNDAmkfx8i9wrSjKoDHftf42dJ8aY9ZeGqqUDE1u9cI5A8nlZg9SElDSPT38Xk0\n",
       "6b5cbbdbck8px04qDf/rtHmpSbwZNfqUikGUZemmbidZ0Qq85rACiaNKtOaI5XM3fb4Vyk8O1FYO\n",
       "pEgSsySQskfCyfG+7QVo7y1LDQW3e4Rliw8jEa4QZbezC1+bDzYN06r/Mv5vmvV5GWCYK5z1zdzl\n",
       "yqOJ6BbIeyg8oY4RVX7p/2MxTJCicB12bqvfdCXesmkZoWHMord/sOHNlYPANXlwk6En4VF/RwSH\n",
       "hNbzxxcZzFz/cTTQQlanUMWWEP5nBWIOsIXKZLmd/klEOs0cwgrPg6AAux0J2Bz+iqHzPs9B23nq\n",
       "pSPsG1Ds1QD5rCgTgGI2RAs3+YOsPCOA4i/Ggbfl8+kMv9I8N+oyGVv8qw+l28jEpSDmj06NHO0i\n",
       "gXg2DCk7JwFFUPgTsN4E/aHQueIEwPunem/LIg6bkCUQbobEqzH6E0MIDAbcFdd2wQAAAjFBnl1F\n",
       "NEw7/wAAOP/d0QS4Di3qOXZ+v3n+xLQx082DFi0zlNM5nFu0W2Wjg8ftBi43sBHkqpzaKfdg0mQu\n",
       "0j40pcjAe4Xto68GVvkRnfJwloXYE5P1LxXjWWXBJ3wB1obYg9urFCyxYuOadU48yF5Cj91MYIXn\n",
       "0FyhYMOvxMc2dGMJssFwGrl31mLJffxVDr+n9MU8L622KXo476YT/Z7b+8SfUl8FE+MmuOK5xo8c\n",
       "2KJ4/VYDpspNGW4zS504SQdvhmkDxO/SlKkki44WHcQS82D+kJ9jW3EXxQa2Q7A9DCTfkdSOPam0\n",
       "JdqGai166kL2dXGxlep6A70NZ0IWRyEXhk569da90M2SsuqV0TY+ELAeSYYeUFDjYpMh2ep1L9pJ\n",
       "XjvZeZ0rv/CZqDp55bwsKxJ5m8eCQMIFJmxtwO8Qf5szJVmAh7yATnGcvoAOj4uKSxF2cc0z4XH7\n",
       "g6vuaA9ilM5kr4PX/GmNnBWdy0wVB78ufoIG0cz8nmfikWS3aephBjrknv7UfAPWFwdBzHcwD96j\n",
       "PSUP4qqVX0H6z6CtBVwHN3anDOGrNetAjQFw1G2aKnWr7NGpqojEa5T4hYv3yd6DLSERVLPVWbv3\n",
       "qZgI/Rf3lOp0VsbCOH2Up4Jz1Iod26iv/8l8BsE6nZHJCIx6S4ItVV7nUONf/qRQ0sds6h2AnvpX\n",
       "3PoS01325wUviq3X0SgasbvZHFsN2NvVDrxOBmKwDVCpeZY1XAAHvDQ7qYEAAAEJAZ58dEN/AAAF\n",
       "iR5eoDhoqj/1p9f5rxLgA/g9//Me1B1Ygd4WFc7Jp1Y93bmznbKTn9LWHP1B3pW9ZlfNd7rtiZWX\n",
       "QpPMv0YTqT5vzmZkKuHq/DRUwo3NmhLYJfE2WNJuLWpcGy31eOwlD1z/+BVN9Z03p9OvnuScvl3d\n",
       "Ri3R2agBQ8Yi8mRIaLG7QuUrnrSe1vmddbHr4ZUm2XdOqX7LWrmm8pxp4yXEATWbrHQmaOHxEXGI\n",
       "T6G+HA/GiQaQQ47z+3xhw7G7OWIGxozeZ2EJUxiQ8S7RyOpToorBXcCOP4WsfLZ1BtS+3e2xpgVt\n",
       "vQ1OaAlsgtXLFIvvBFAGmIpXhxbSEwBgpoBiwAAAARcBnn5qQ38AAE8pennoYJGe6esAzJjdLWHn\n",
       "z/3WYrYTJpxMoZodMbQgATjOUEBlvdkiguvMdT8ZtGxnmMX4sSRwyQHOY6Az+agzwFuR5dVloO0B\n",
       "5t0q1lSlD1uRJ1FkHrB2KwmeqnnIjYGClPGdkL3nr6xfO2xb7DOM5p9qxYWrRxmvhK3zmnJAVSCk\n",
       "J33jpBFL48I2qrJOWnlMriaao0iigOIHSPst1UYAYhvsBWXheHyi4WRc3Wi6ztwYs9gjYVoc/H48\n",
       "YiJqhwDQT617amPIMvWpJQS/J6iNeMoksDPujRJDAUkX1+vTMqrUUZeVYYyt5GgJqMKrm68jXnHG\n",
       "ELSu3QqcQBUJW6TtVBtJzBZKUcoctFRCE7AAAAaRQZpjSahBaJlMCCP//rUqgADaf40ITNe1WtiO\n",
       "dgcNBzYFlQSPV3nuuIh5ZSjWxOYdl8djXs0ql0ee09ul2x/GTxv6mjnDR9p6n+K3m1byV29buKes\n",
       "cI4DMRlrhsyXCzBYYRpHa++aTiJ/Coe0q41DbDWzEq/0APwb5WmWva8uizm/0+QpcVKZVc6PO7tK\n",
       "BbKEHGGzE9WGLX2DzI4Nxm/W7CJKDOnpKXksz0FBncngzOBmLTHZ/9av2mNW665hr0PTbPU3+xuY\n",
       "cu1CZ/xnMFXzoXBVtAJUuTBPHnigRZXpZ1JCD0JA8KKBxk7JXozKt3fiG3XtwhsaZER0dTMVnbsq\n",
       "EoE1QGk80VyWXsU8VstiFkR4XOXKShdlzrDn3tTtitUv3oZOqj9/6PQ8NstgeheSYvhRA0nJMqyA\n",
       "NDAw6MtIEqxkA7bqJfBTqpzA3ruu9UomM5ngVWfAKH/schUoGdWwsQ92+nrrIWHRMa1oQxd8yafK\n",
       "8g+zgeMqBhcHZ7yaFzTzwnW4HuRIIr1FipOTosdhu4vgapZY3EX0nJ1cc6DTSShyqyLuvBpqnYS+\n",
       "XiAoD4eF17uzWVXc/hDw0Nil2KEyHoKBkvchifbi60ECcsnLGleobyq++M9F4BX7ZUFYdIjQlpsZ\n",
       "I4xjRhCtN9Gu1T7R8TTS/da32M9sb+tBCZmLCli0Ouow1zimS7UwQNCP8jyQUUmcs/sta+yXf6Dq\n",
       "gooupaaG53H2ld6TIGExlQ1sYQKrGdWBjaBx25z7Q+ee0oWyTvnD9SfJ0sDPKxhJjfRFjCmFeB2s\n",
       "6tj6vPWRR+yyrh8GaCWTmKCqXAJOgkUvijk0GNL1wnFBPYXFaBenjS397SCwr4WGcEED0ASLhC6B\n",
       "HdrqPo8D8Lea2hRajHnkXvVOXl3TTmW+9LLp0S7D1rxLe/rg+pF/UnFaVLNEjGbOSgsU+f7krRY/\n",
       "x7ADTkKgXkoTBkmI9PjGIxFYz2z/z5VcHD+VitB4bVNCML+dA6/6Ww+bd1Y8wtcD2JWej9jWJaHa\n",
       "odw19D+rsKlNec+kmrONq38Y8NgQI80AxsfZ6YIlXwjvtBCu1FbP+JBKY7XCVdi7f+wX3r3VvfWA\n",
       "Z9X8KNmmFgEcEVZJRZFlUGWW+xaisNqVAoO93CnJ1TWBGuiiFEauQka8O5G7O21cWHNJHRxkyr4l\n",
       "BwEcUcmEu/68t/BER4q1KE3W/7dc8pS24gH1a+LM/D0JHw0niPlUdD3XYKjymQipV/sfx34wI6Ld\n",
       "IrXultFAJZFo9UEinq/62kDckRtnlull7WADia5TkjWdidjNWFss5vZrt61x5FwN0yKgmNE+vn8y\n",
       "Apspv4wUEbpTWMZlOw9R4fT2ywsCXzsk/kYeROabeGHUaQiyiLZZ1ELDLhxDiy9usrNT4WBfXaWR\n",
       "4L3l+L2rbrR5XXWDrRwjQ3jquKjpf7G8onHeGIJI2ttPdWZ+pBof694CCmrheaxRDw/gsHRrDAdb\n",
       "XevDIUKhrgWWj4a/yiPlge21SWjkQ9UP3FekJSNJJBVT5JaUiS5G2OWEM8Qn5sjuO+jI4ltxYxH6\n",
       "ezOlcp+RGIOXHk3obvJZEk8cQ1QNaUCENdUqTU2KDCzW+3H5rB/edkE7po7BzRgmlYEp6StvoLZ4\n",
       "BuocXIoOcZPK3qxmYYT9vMABGQFCqE7CqqMgGa0hDbqVbdvMzJCRyu1KxN7czDtMS3yo/YTSbA72\n",
       "tjXizzDMO49h5gi0hQwqSAsRadxGANMG1E27fiXCRl8nBc+KYnhoGgenr1uPUtGHeLH8F0bzpj+m\n",
       "6mwS0Qf8Zd3g4c+H/KyaPj2Veyfo3lmJRW8hZ/s74m2xbSx3/rVGW4K0wWIr9VxuC61faLuausx3\n",
       "tE4LxLSUC1W3uKX/Gi11TiSf79EYaNOYuxI3Eh+0dfcPvvNet929oWhaSz3KWSZCtx0nh7Fk7two\n",
       "/pC0q6VQiWH3fDSirL5t0ZHAceU9KqYAuHiKRW45wsmjpbbIvdhw8OM83HK+PSCZuXlAL68f+rLe\n",
       "4a+hJb7C0V3bauFQ7jYN0B1L5YEj5pN6ASzO0s0BWX0lOQib2fwYIhC+cj16J539M65Q+rx2Sds5\n",
       "RpuUifKlZPVTjJBNRmosRBgjPp2/TGH2PMotNKOQT4zgDHDY4J4uRZlOMWoljR/uB9+ynTBRjXlJ\n",
       "qGGzebHNJpuQTYQU97OL6VKajuXWK+0/l/y+QLuDysyBXkaooK4h7lFT8886pHVT98sNMR/5NXEJ\n",
       "3wAAAllBnoFFESw7/wAAOOew9FuuiQzXcIaN+bUpap9KADuRnCx4YVpst2pk9DEO+Ca33mhBjdrk\n",
       "3uDr6WF7afJaKtKo1tVHlOUeZJjSCxzuQ8x0iL+aDPqFCMEQuqZo5xSliyyP4S6EX6c9I3EKMccY\n",
       "9NG/c1jdiHJmtwl2eaFsEuuugGe4+HFMgzBVToWT6YhiL0u4tuV6xt0P3Oo2OaoTJ7IJ5Oj7YhVH\n",
       "LL149lKleFGIyAM4deFrDR8cz+nQ8OrG2VeNiDwb0cMPqaanS0KU1krVz3ZbvGLtXfY3mbpx9SS5\n",
       "SyyglxVRDn+DtXl9C3TI94IBfOXCp0YMMCpW2KM6DbE0pusDX/PA6rDbTOvhANPrXXrDou33HQYI\n",
       "EmvKJo5SFOAEKXeRrCpsHZhodjO1IF8tmER+M7fDSQL2yURvYg09KxbzC5xs9hw3W5MqC1kbiLCJ\n",
       "JSpHrZU2pmyR3wPnzj+DU9BU0PET6yli2M7PoJQtZM5oixUHe0MCfTlV/+s3IMaz2tlLHXy7Bk4W\n",
       "LWcCa41/Fufc5+qfOqJiQ4y8Iht5K7x3oiWlCbbv9EUgRD+xmNAzoZhq330TUx8XTQ4vT//ns5lh\n",
       "F2+RR2kxED8xv7nVLOuaQ7wegQ9EFMsMoDu+AXIwYFOkV7hTnIoAuw7/eYcCPoMvD3rph1L6Yk3J\n",
       "xI8BpF4Miclcnl/Nfds7h0dW9BP/UW6O44WFpGOlIDkhQFhPSTLDS/fpGlfcWZTmc+lCNQ4Iorl7\n",
       "2brxrdA4sc34tQYW6mB4BWtfsDjOqXXj8KBmST7I0ONpXkEnAAABVwGeoHRDfwAAUcaiUDIJrROr\n",
       "Hbdgd4IAQbwdy1W2UAAVdurrHD2P3CZftOJjhtGCFvKvKfQGvd/dZwPwUvpGxAygqnnfTfBN//T1\n",
       "ze1fcuGM+gUsed4Rku7flxC+lpM6Z09KVe3Ag6dz/hcFFzlQsCElC66g+VYcMjoKAOFhZlapppGV\n",
       "qD2KX3kHCyPCc8uKQcPh9HkJZDGMZsV2wynMNOIQQCf50/jPKdocqjxOeQbgT650qPhJ5aHyXwfy\n",
       "s6CZn8NPLgdbTQpkIvVlfVjV7K6zSTZtQhByG3Ei0oYCle89rqLm/0SdUgkixytCP86gxV5DU8qE\n",
       "CQR1FGfBPhAAp0ynE0wPniyZUPom4JvifyW77U6pfkWd0oFbI5uLsamhCAfEeCy+KUXKJXhlGz+Q\n",
       "he181G6nSmFgnLpz57qoUpGa6AjatOuVcdHd8IPr9QpzLYw44WbowIEAAAE7AZ6iakN/AABR5WIX\n",
       "zk35F84jAnx0rbdfw3oAEP+DrTSh359V8X0VCWBZkxcbHkSTaJP2AgSRgdYEG5UrAjC1SXY6LYs7\n",
       "Cd4TKyfHc0538615HqwgaBrliEAnnrj/1or1ndW+5NHqETiOLhc1A/gF1iyRlEVMidlYjASfM8D5\n",
       "T+7DbWYZO62InLNwpujPwNfb1P8bHVF2bSy6MhenhzH7LKn2xZrvGu4aQPEK+hUN2IK8eTRC4Eya\n",
       "UW9Gt043HDLENcP1KVa16AVe6qkrZmIU6ObSgACRoVWU1vouIj0pRjHpe1KyEADItMGTmL1ysxLB\n",
       "uElzEmbQLTJv6u9kHAvIz8zSF3TPUjqg9GBGRlgaBlxiGElunmyLGKmYOM4ksW46N72E3V8GWmkS\n",
       "o9XgZvWRkzDrpmQpOXBTsomAAAAHe0Gap0moQWyZTAgj//61KoAA2j7LjbACt+xjgmeKRPkNUtC4\n",
       "AmoAzMZM51622sWgP4/qrgT9V5gHdd+gn7XKapgBRzlYgcfRGJp+F8OjiSYR9Mr189kBDlKAwfSK\n",
       "2BWI25xXPHoytNdEn4noljsiJbn3cp5zaRBF/Vj+EVyS+VkWDh9YYHKTwwOCdoru9qAPzrdH3fmv\n",
       "uBABypsu3vRjcXeKK4KinyBKxrbGNByBXxWPnmOZX+i6VbT6+IDsI48uAaK8Um7JYmyxENPNEaxE\n",
       "FfbA/7JlE4bT3pxIQT+IGDfygjgP9m3NFAQJg0NF2OVynCwsdj2CgMgDxvAoLVFOy3Is1QxSjxGE\n",
       "K3Gg4iFIDna1WTULwaj+XMeMPXo2LpvoZSD9TBaETlt5uJfdsBk0U3Pd1GQ2QMaPa8/SZQtjaWT1\n",
       "IIENhphhElijNvkPg974H6KNvWdsh/yUhCE4CWzZY/BljliPSssA2sIO5AgD/Ubv4118c/Iwd+WC\n",
       "NOxqp5Z2M+2nemHJK8sUz3mzS5GaWE8aTQiSQcHl+iqb8DtHVqFVu908+oZMCp1D4bqRyxAaetDc\n",
       "QR5mu4EvJBxCrug1ZuT3GCxGvfVICrdkOtAAgGCGPeZ3EoZ84TCSPAvIqJlWqEPznJpcpCZYQTB0\n",
       "H7O4rUvzacKTelbsA2g5cAvrQdqmDEFu6f9bMiBLYy+eWe+ddtptTiekGbzy6fL0OBSZypjlQKwK\n",
       "+gUN//+g5kgWnCBt9DE09I2h4yx1meii8mImYAHQ/KJ2+037W51J3otEG8ZN/oUX6tGr4qDfa9OV\n",
       "Uj8B+Hhy7nKKFgkNuhg2XW0gvvYp5HOY67BWY8MfaqZdOqTXPdQRnhvnELN0OVVMz5ZOlr/njdRj\n",
       "EzAWHNy2P+jsDyqEMNBvzkW7ydbjXdHuDiZfZl7dXid2K0FoG4qUmhx2BDyX0ZoPID/YTfYOPS7W\n",
       "M2wJbve46EPmWrwoKYQGDd37aasnOQUzKTef8O7zCFe8ODMY2WhUPnltaxzfAlZbdTyXDo+tQjgn\n",
       "YzBLYqn95cojDukkrGuoPoLt1eOWXC5RLBd4FdAxGevirNWsStzxXIaY8ayjRy5qM/HHoHi6/xRD\n",
       "qH1x8NmqyBWEByB/jiSs35XAeVdXDofsNQn16HIvCr4pJqlxHx2Jn1LVIcGOZv/8rpHwYUbIOwim\n",
       "4TRQUL1CdJr8lPpV5ddSJ1UKtRlYIbrd6Df24TRShB9JP2rSUKxe9mUuHV2xyT5OopdmgdA7aDrw\n",
       "8BNn3x7yrrHCE9imnd8I+ubdhHMOU2hvaOutEmBfCIwvz/DUNV2bMCtQTNj3CITGlQHdPUFncHuK\n",
       "HwxSOvi3dQrBGIlOLucKxNyC3a2GDH3zcQB/aFQAevgOSSfEb2w85QrTra8Xz/5FzBm7cqcKJEOJ\n",
       "wmCfRagjrqPdQ0QUtqk0RI7wqdwvqg8vseVwnVEaBXv5A/akJjT35WcWlnuL8oAnzwT++gYKWQYf\n",
       "N+OenN2lCVhM5mRpmG5s7AqAUUa80nbM9usFNxnxxECBE+g5/AasSNMITHrkH/TcNgFhlAOBdVZY\n",
       "zkCDfiNV188khh4UmbZA7raceYBYsmKPc2qinX5V6zn2HsFQm8Wil3rnQ3xSTzIyB+Cnv2tzOgUO\n",
       "3H3t4SsPlHjeEmAyQbq3qEtgQY5SpsUDzY6WTlqUaqimhRd0c38ciGHjLlilUCIpMlzlacm+T2RV\n",
       "KDV9RB3o4vh9W1u/bEf6I5rCT1h0l54b90i0kEG5oLBGJ23NKnjixZ3pWfYsHlOmcacYAzi8UuXe\n",
       "2VOflTw2BMreiPsidnsfOb9ugFvDg5ZHzEqWdyO2+t4ZYmoxLZ9dmBljTp2xKc8N13IA/tiyzqPx\n",
       "H1ZaOhcYAv9moZAXcnWk4dbyDPAAXsStVCvucMEPwy9TPO5sra72KCAmfqhqzEMRqeMtz9Q8uvQM\n",
       "X5CHU3tm9y9g553ncApbNSiyrgfHPhGXlit2xfkxpwRE6XX4fvIrs6T7vK4LSZc2FXPXUmVfEMwH\n",
       "O8JNKjpvViHJ2qyNz7dZXaWJUPdyLqYoJkMEZAQAbrYk/aSlppe8yyMgAgklCSpYXavP3cG4PVAt\n",
       "7/8hq5lot1DNCppyBRl0xqT+3kRRyAnU4+LMc2vWFUr0RnT/kAU0OC5WA03TNPrfUecfF0zmzg6P\n",
       "WKTvmL7xdC9Cwf2cjsJkwO1zqqy8Hl7i0XF5UYotZdzRCwRuKrwUzfDfuTAfCBKp7EAXZc0l+Fat\n",
       "x8w4DGcI+pf5Lm3g9Oij58ki2UGlGt8TXh1VeKvf9EcNi1CJEVbaS1kZ5fjDDpLfFNijMO+LRHqH\n",
       "8gcPvxbzcCjUcJ9sT9+Q6f5ZKYegy5aA9+jK5Jh+UayQxnvKUjn3wmEsTbnAtXhI6Hu7hL/cA4cB\n",
       "2BpfzJdOzJTL/7GiBZUnro7BCeEnlECis+nzAHtkKEqp9zoM8T6yaYdufdmu/9h0kUib5zr2U89R\n",
       "MPazhK2rMzdRD1qZYiD3QSimOb/2hdfn3q+2RVtUn/j2MIkMkdU4K+VjXZQtYo0w/hvrFCsNJ8EA\n",
       "AAJfQZ7FRRUsO/8AAzwnJZea+3+EZ2UIuqPqmIsQBDx9L+QpHzodc2XdOdsviYPf4nAvzIuddXXh\n",
       "CfsQ5yzdjZuU008jpz2iOLV65hldsiKXE1/XEWmexI2GJJLpezmOxsrxTudyJoOf3MCN0fTXVpyB\n",
       "WfSd09d9ASsTsETpveRt1ViyklGuzR/coCBHoNzUAh1JfYzppG0+H1kU0Zuv/h8/CSqlCDMPn9E6\n",
       "f85lOqRlQjFDl6xaZZEi9T1ryTQU+YNVWm0A2ETf53ytnUJvoDQlpmYBfpb0q2/ZaQi9rh1lGDNU\n",
       "dV0I/oKpABnZsen3MsKqv21ukRh+NCIeTJe7oEZtMB1+S2IYXDbA/PrmP/V80pU/dVRVLq+2QRbu\n",
       "+TUbfoU8SO1q7cgsaR9nw/5N31YVg2fWNRITt2s2s4VO6JfsXcztNqzjrYxVQw4y2e+hUtfJjFvW\n",
       "8bHsUv3YDPDcDuM2fut7C3O1e+exKH/R/In1q0AN+fe+/wJdmCAQdNcQ3yEOdc05zQoFU23HLmUE\n",
       "7KoZN+7ohL5j7Uqex7JcpezeWRMNTDbL8WjOg1KUu+FJz0yUOJbgk7ALGXruvIdWqNX3ADSDvjGa\n",
       "UpzjAseKlYOi9IwfVKt3L3OOpoOMGsp1Ds2W/aBeShoGbGOX71zny9699REMfYeAIUam42mUkP6R\n",
       "RKW3kMM3fnwKM8QvO5oOIfhKm9pMxPnx12xgsxfjYu9xWetcZh6fQVWZWDtJZWIhWkPpou2/v9cO\n",
       "4rlWWh+n4tY6me7sWtyTFdCtcq3anoX8MJNQ5yJhbMlf3JPMKgYQcQAAATIBnuR0Q38ABLXezx9v\n",
       "P8hNH+iasE/iJGMtxhugbj3AARAjonCNl8c3+6suRbWJh8nYGupvMeh/KqC8MaLG094fvGT8OcEq\n",
       "fd4Uyo4LExFyJ4utIZpOxGk6sdASU2ki0o9tabi08eo1TTOiX7UhP+RYiQYqGptUZJrlYmDtzEEm\n",
       "G1XDUvZWWbnhNx9A35wr0Bh+Mo6EBkE6bH573ZGypb3mwgOFcIAFh+hw4WD1wTOIm+UbgR6DhI+y\n",
       "folJ7wAA6Jb51R1DRQGoqW+6W8qtYP2BUN/JOgYwZuQmLgIkPEk4rEJvqJ+aJYourHL7TOaM34Ap\n",
       "HC+Ij0OpuRgknY6KeXiaJR1HCeFgSkv6kobk3oLuGpqJgc2rYwLCWT36fGc8EgDr0RpZ6Ag1GQhw\n",
       "0VZArJsQAg8AAAFHAZ7makN/AASHWEzQIbsmsjq1Aqs+cYlP5twAyRsp/EkS0NTOgA+Jn9OpNt6p\n",
       "bhurVrNkVD88/trdqsovGb1kkOfyGuRjYYZhht/3rK/XvUBKZVKIPbQ65EOHYAcDgU5OSIJsnRnZ\n",
       "ZCpPKCNf7uvM8nxJwWNMa32kPIir+TwMxkncM6YlH4Zqd3d6NM/mvInnzyqxXXZJJfk3OneDwXQI\n",
       "etXI1UHTaTuEiEtDY6ObZrD79xd/jAuOAv1tFcFtrJbMbnI/BYv+bZwQQ7UkYsM85uSauAECfJMT\n",
       "oBetknqnS6rkVeY4Hky5qAR0+zvr5jTKwMfV6LfFvUBkDelK5ghWHvmbOxDQUFU/xa3PSAPzhc/O\n",
       "5wIJ+ME4AEnjKTY6wpRNCHbCItlJCiF3XEjSDrolPtUMAlNssj28Eh2+QqCC7br4P2CYgAh5AAAH\n",
       "ZkGa60moQWyZTAgj//61KoAA2dSGgEAONLpAWVs+8FeRv+5B4iRioxioj+W50ZkUkc/8Ff49L+ZI\n",
       "HJTdUN725IW9uCrB+9ns20gIfqvg48C12y2kMwFLmhbUKW08Y54S9NC8jD2IrEpvTzyZFNdw8emS\n",
       "IrUCjSzE7TvotmNWqqj+eIraOhjFaidTiTOcSjh7eflm4nH2VrbTsvb38s1C0olIFwacwnWkl1wC\n",
       "YNmgyuQuMQrA/4Fcw9jGMVTO58SdF2c5mEShMs1qijFfr6VWsYjaE3O/+mq05nzRu7CpRMCtz/qs\n",
       "yuCk31Z/CXmKxUHxMcTSlfM8+Qkeiu8GjJBaD63R5a8Om6p+TZC1UNJcbFyGP4ycs9zZlnuh4qA4\n",
       "U+vuOpfXCeT7yzRg3mhqEdpcNNQeFHY+ZiF6h9rKKOqiipHieN1lAum/880YkmZ4gqUHCdBA0R0m\n",
       "z8DmuA9OryN656K8sm4oUpN1iBCmuK4fTwhaDkwS1v8Cs+NltB4YrjqyGBfBgtsrbRG2Es/p4j2k\n",
       "WfhZstJi9UmJzNwYmI+YRtpRPIVb9B/T18VCn25yKd2Fk+0ynGpxpDTIXWNwH1AwgMM5u67mCg7h\n",
       "IAVF3bSlI8fD0/4aO0G+KwJDXSAGOCBeEI2AxhltWhMm4BP/zkQkIydku1X/lcRvgYYuQ8V6h/nm\n",
       "+do0eLkS+/4iWhKKVY1i6iT1ldjLuI/2u1KR/l02LcAU+WDyOtZSrMjyQ99+vfS441HeFWFECBJE\n",
       "K+8+UyUhryWRgzkc4u1ZG3y3KmN3asCRgZ6dP9NLP8S4STtV0wz4gJg7NpdRjnzrw8tfth/5hopa\n",
       "G+ROLF56ae8yUibmDQYPAUV44XXmRIo66dssWUfEaNg9Lj/B2MH5yngxuijp4yOTp5DHIBp7dsDu\n",
       "/wYXbEaxqfSRAVZVkDFSHK5tSuEfqugrUEqOGjzTTdwWpoD04vTRGnTNQ+GKPtuOqG4vfWZUgji7\n",
       "piWx2Olp02rtYPXlGkjchEH2T9QdoSV1xzScUefNnBpZj5Z5wX6OCt2NTm/+2zDZ1/nMjJ9HY6y3\n",
       "miVUDhVS5rkSF5Dx1Rs29KEkTniLVrYtEsdMawJrASw0/pwvHdCI3DAl2vAUrJVc935cjSOFcy77\n",
       "hsuFuyZmSt+5/10F3opGlI2MDTZn6bRGtdAUodDoObPIa/XxZgQnSDjUtjTIwX5G10ROEYxr8XQw\n",
       "sm2oOTW0s79lnYKshzYv1DmiT5OpCLdwh/R41cb4aZSFh52BBRN31qwKnD5xJnKTekj8XDuT0V6t\n",
       "aN0R6CIjtog3GWVCi4yiQes+i254CAr1qMGCA2lpU8CQHmfoff9sSFeesjjqZWj2pNrBps0/mvSY\n",
       "EsuQSAQilMt0EIwW8CZbnPeGP5W5vDYbKCnkmSNKJutTiFShhqq/yjJwKq6X4vLYYC0i1Qnxe68B\n",
       "C/W3TZ3K3SVBmqWqVQ/l4pnBcIBU1tUT2bsx0lFgXbDBFCdF+AXamYy4Sb3ObdikkcYq6xiBWSrk\n",
       "SgqmLTAL7SnqCIWfE2l6Y13O+0fNV0d6QxSMwSnmF8mU3nraLR10ney3wmf+AqaEJqf9PGh+zo5w\n",
       "znW4Z2Mjl5TNfW25n+2uViSucF1T8IzHYUnMpTyn7Ve6zDmGyYDHW/m17OxL6XLXlp7R+TSivu4n\n",
       "kEVJpMs9KruBYLZlzdKsb6hC/kdyDDWfLkYosg214EmDJNsVf/gXVbzopXy6GFoAjcmzutqXjvnq\n",
       "YSH57esBPJMOtLksJ7stTJ3e2epvJdWUcOH52gTYpkSpRf8ptADlbnayUwdSheMEDUoSnvHrsqDQ\n",
       "cfwDXw4nJVri70fjmFVYbb7VMO1VDcDeLOxg/kJWsmW5mI/QGlM62423hmDcCDVmO/gy09hjHQjA\n",
       "0anLkxjw8Cs92UtRS9iLeq1YFg7gGnx6x162flfwyRFOmoH2CS6ZAXJ1a14yF6h1UGynY/x+Oywe\n",
       "m+Wnmlm/iTqHK5j88ZKeFXnVoPicEKpVaurH77Mcp+IgWQPjL+CTBwn13s8EQSgV62M8sQBV9QJq\n",
       "8xMB8nCczPRIVVum/DuVhpRaBLe+SQUcOQpgCuBAb8dcPvlyGsNGu8no0fuQzxbievRxbxwFM8O/\n",
       "WUqhUHd68YY0gpw6f7hPMn5fGH0ryYtmQY4u7AnNwRlJOMB1mBxJ4GSb/ae8phtv7WPfZDiji7Bz\n",
       "+QqhR9XM6vEWqApnn+pLPFfXLcDm3dr4ks9sR9HDg0ECKBuhBh/mtqyglfq0FhajoWO2/Mis5nmH\n",
       "YmrWyXRh7cLR5yfzirPn4mc7dvn+CCyV0mgNMPB5ubZHnoVWss0St74y3rHNeEmh/kT9AYpvpwQ3\n",
       "SXvvdDHfsix/IfgX/wJt8RhM3pNHFnsq+Sb0P6v1lUhd/J9ShM2auUgrYkKOCS9oPJxE8hUA/fQT\n",
       "qvA0XhLwsOJtK811jqwaZ66EG4nGU4j2lOHyhZ1kGUgmi6qD0n8/FWrx4D7v6yqGlDQqE7AQZAPR\n",
       "psCJ+Mr/ptJvDbZytlQAAAJXQZ8JRRUsO/8AAzyTLlH/yxyKiLPSqdlC7xwev2kNYvamYuX++YBo\n",
       "vUFfAeaplKWCJLbIhadshiNiwASatgQNigAjX0japAxa+4X/ZFTZTHqcxa8hOnNJ5/b9yl0nACMl\n",
       "2hKZbCi6MGBPy7gHlB+W7F/9THDCEyNEw46I/uM/DLUexp4LdNFIKEkgavPs306zADTzalWkyUE+\n",
       "XEFI0CeNk1WH35j/MAtvHNatffTqg225C+rKLflOh3ZSoDjpYBtsAJ7Armz3HYoGiExk2fltaxj8\n",
       "K2IPaUD22Lx6KXQeeeuJ/669EUC2CJ3Zb6Py6AzUHZaT97EkzPE4YMZKahkrQhPqbpnl702RZQ1s\n",
       "2g/GgEf2hw1fNvy7tECsy7a+RrpP/ExPSdOGoxadBdB0bIf+5OU9kiF9ccz9Mwcbl955f2NSCD7O\n",
       "/mi8Zwm1lmAkPALBgTMi3q0LeT/AFZzpXqcYfdqhlvoXzkoMpYBHTORKnKaTu3QMStRZfIQWc7IA\n",
       "Lvn3E2QmT8wxNcgnK8M6Apc7dXBiPTpjubatfr3DT8vuW/BFUrbCyzJsO0kZNSTP5PlAyOUeQ9Mk\n",
       "WCnr0Os2e0r3gKxFHW1ayhc8WAjGNOAVS5ExrWHNXcYy9owVi3s2TURGAbUU5dR1jzZgHvz+kpoK\n",
       "TpDzyFjry+OKl5QoUTRVHIAL60KI+XhxPbhNPl2QPgLKEfMdoYbwFeVKnWfL6+7v33wFCU14V+7D\n",
       "/6NPic5/tbRRuRwNF6cX6C+cLUdH7Fk1WLq2sqjjSatZcl7vrpGMZrbfvK7KLaAAAAEtAZ8odEN/\n",
       "AASHUMbN7hjMSwWkk03OhkE3rlmzEU1+vKA3nzKHI3suMAJc/zJd9AaPdL/kMJ3KkVG1jDZP/nTC\n",
       "kXpaMzdAlcinynQYLm/CA0c8+889sflZVSykWhQIELO5pLahK9JMNGLalngcDBhuFtKDaP+uiITD\n",
       "lrpzonMu8NN/QaLy7KqjbP0vDQZ+4XP22KEe9I/U4OwV+Q5oeD5X2wPcAlkyuK8udYEWCcgFsLAQ\n",
       "VgP6GpNJ0kwOm6Zi0sQlZGkXbHAKUdihmKy2w+RSWQFKatR14xqbRvoTH45+3BajV6hLDc0GuJgG\n",
       "h4XSXI4vtrYVHewsOQe4xMRQnTpWMkiXtj/076NH67qyouEuv6TpnX9rahXR35G9DoxXFY7i17Uj\n",
       "TVebKuiLl3bFgQAAASQBnypqQ38ABIdQ3EfRoX/ihVKThNwLfdEVrbY6+nteVbugAjC6Bcgl01Tq\n",
       "KZYN3zH2kSi1nzbWT86nIp0JB7RPw8x4JxiSfJDJhcrIhAdL3jAsXjqXKvPOqusZFz+u0uw1VnL+\n",
       "KBM/RYiemOib9QKadFar1cDF96wylYKANJSnPcFtlprGqPVcf/5Tce4dmYZiDyY8JlacLTB1HpNC\n",
       "p6q9hKpURjxoG0SJxHzzDbGjvP0VBdQrluC8IAyWYGhkMsswQAFDCKFxfRFz4ZPl86J3Tt1dLKsk\n",
       "G3dV8LdHE/iYJ3Rs+6Jg1LcDih8otnIKzHNeuhX5BDq0S+pMHeN4uHvfcT02xrpJ5BlMwO4WWv+p\n",
       "SPHpG5qPpIfcH/o7yXE3gyVJ6DpgAAAGQkGbL0moQWyZTAgj//61KoAA2WihqKSkZBo38IACzulm\n",
       "uatUk8113GwBtFeZkKY0LBN3FQr5S827Uy77rIDbZwrE0NBTVE2w9bOMmAqW9UKpQ7FjEzFdYvBZ\n",
       "bmLVaH2X2hYXdQ/npEWPetpUxTXFr8bOzxOWjIHLsbuhHodHQJ7jWaUypootDRWm3pYIystS9mzK\n",
       "eyYISZ8EdKJEV8q3MM2muaRfI8dP0CZKeWKfqezNcyrhq80u6EVDzexq3XFltYoHJvp/p0n7dp/n\n",
       "6uRaExvDAQC5LSJEe5QM2gwM5rI+zPaD1IVJNtJyKyJ/XcghPb8UCSCaRMWY4uAWsWH+ylbCSpCO\n",
       "Ht+fgxxauudOK0bUtO0GFGpw2OnN2Bcj4HuQ8fyDGCmbghJquzZtiiKbnaehi/F7zwqb6cxFDMu8\n",
       "LpyV3UXbmRB+4b3YGthQcK31MzzMwXImbqF70XxGuZ4F6avo1Ae4Tkn00BNYKSm6Ax4jkFlI4vX4\n",
       "DjvBAVhc2aGHmr6Tp98sC80N6Nc6q+g3nPonvq3aNM98fdkRIuveJTSoEg9ddSLIHX8ta8Rf/1wB\n",
       "dgZeP0YKYmxl0SLv6EFMaDzv2rBustN1PYAZF303FIn+LAhXeJICTjxVSP1mrsZ2fO8O0JHrsIo+\n",
       "3wi4O7ywMgk0fwipugP9u1TfzFHDQlaIiWdGzu30kfAklX3nxd//l1qdwyy4AOjYd9ZdvN3Xxb2x\n",
       "dO05+1WLx0b+GXtn6jh+e2+App/8CtELZkxibpuZCeJ3ccVjEYhEU7ukuKIQZY96ZueruZZrpid4\n",
       "nraNsQm88Sg1YGLMWOB+GZf7eOMQbm1dwkLYhNMP3+8UNuau5QD1foGAovyllRqrZtyV5qITy4zB\n",
       "7IkFa7NwoijHJB59Q3ahdWo6uyRn8jkCwdF4n9gxjOQUxC0pTtKDoYvbxK0lwr91a3PBRWsZjQTs\n",
       "Wgx6AXiacc0U7Ij1Lbmu4+5ZtsPl8Vuwa/2WPVKtS56SBgBoRegNB6g3MNJH+Ti/6arkWQcsgtKq\n",
       "ng0dUPGkbOAp0YwhyYpPcxDej7JJ+umppMwsTPX5UVPep7JFIddfXG6nyevLk1uEoAWLNttNGkGC\n",
       "J2zcSb8Z37nJtyABEk7+v4RJRFlMwfWk8QhsGV0MIbqvTGMA7JoKUXo5LbDSldVdJWK7OMv9Z2Ks\n",
       "UqImnfSvmr5cFvurUWvlCeHFvJbGs6ssh/oqP39HQVx4UiPWoAyCVtF2aEX2hCWoE6JMezxeUUXt\n",
       "5s5UQ6XHBWXp91frF41FbHOkheD0rJ4Z1B8P74QG04g0d/4UTMWiRV/SRyEewsmCTTNwWn437U1a\n",
       "vJNsG7MlGU/mZOMJm2WYSygrUfjRbkS6osoamndFD8yp472yT0cca719EDA575TrLI0QWcZMHWWe\n",
       "dJgFiSRKqX8WSJCRB4lBsvHWK98SVdQ9H3Pq5iVyw8onaiVWrgqn33v0WWVYwjyyOzxa7F2DHH1K\n",
       "DAmiD4nLeI6vACRss08c59/21iNZ99TC5ktqK/87UR7Je9q8XN1Xol6mtmGldLqrF9JeOh3WY1NN\n",
       "r+xE2VAWfUetS2RMJOAU2bgLoKsomgZ+RPIeXIcA8H+z/JJdmhDWg5BlDeNsSMb/I56n2M1IE2D6\n",
       "vJaLjQX65cExInlGML6+Y5yywoVGM6H03GsEJdbPjohHaN52cj3X+qRuGrHGf9nZTsu49V+LDWFJ\n",
       "rdupdDclPj8gsrOPpY6j7I7cszjwYnIrzq7HIsUGiF6h/szDtVqM+O1r65/ffenMY9DBBmr3+W84\n",
       "vybf5sHhME+Q0qKMAZsttucwHfvFyJREPlf2nAFiSJKAwYGM6zsU+gEMFkCoJhIsJW+Z/+/uS4kE\n",
       "yaFnacGASPKBoCJiysnqOmV5Qt6lBPi3NkTRdMRZbcE/URoebXZRCbu/pQiJY63+L20MEsKzes7C\n",
       "Uqxp8vd4YBPOnc1PQylJeRjl8UE/vJgGZeugdG+JD5X7X9uXWJH5QtfzbVe4iIN+9lULNxkQ2UcM\n",
       "JRtqzrrYL2I8LijtlwZxcrxC5/9/90mSRJ0jdPmLAx8qfV+JPky304hHFiEKUu1PzbRSiKRdI3dm\n",
       "zrQ0kq05PDGvXn7uR5y6XFYWdprG2+Wd4TIJP95JMAAAAfxBn01FFSw7/wADPOpFV8f+7lPNRpzV\n",
       "fQAjBKMG6Jcn2m5oeEKudxiD815KMwkVPKUOFfnC3GZUn4erf7PWr7yz0z/xcNuxULfGHuDwZIf6\n",
       "BcpPhoBZFMRnc4+bh7P2014CzIEAdd/HyD3xjrBvw5IOFW0ABmYtEmoOh2tYyYZ57Nr8TkOFpVRl\n",
       "6dGZnxjnlOOWy3Uly4O6YcqA8kRKS7SXgfVpUGG1r0v3hbeK1ea2gEgHJb+nCubNOrnNPYZZP2NF\n",
       "iBQ+J2GjpBgC82IhHjALxpEWjkpJNnlv5H6Yg+If9OP5v7S2zitHDUbo5nOVWX7djnQNWr2ksa67\n",
       "tv0rmHtTcTyroN1toQ/ic4fATWfJljn23LVDwQvQOZJeAbyAlXZf28kUUHJP4idCZbbwzZGPbYnv\n",
       "HXNssmVOzuV9BhDNU+kmwNTaHzWPfun0Lf71SDX4AlgTMPFLVMppxfITrxLaf651hRTDob3oZebY\n",
       "puCPbQOkUtArhP00nx0jhcW93AfDzhekCSHk6seqOZbTUmXijyT9zpZ5NsjfyHZZuF5AERwRtAo0\n",
       "+9SaO5s8eUsA0tTsy96Os1b2na4xvtdip5N4E0nUT9bUUjPL8z/f93TpLj8Lwccyz9mSkvoQiaoD\n",
       "jhDMbi8y2o/zvxTNjVYPWI2GiwTkugg9g2uirz5bAAABIAGfbHRDfwAEh1dkd7tizy4lXXA9XJlA\n",
       "rXUBcHgnuP7Fy22yYN6TpifFUcKM37wBgiJUsGvi46tp95wvEAARYpueiYoTklhO9KP/6wreluu3\n",
       "zrUh7f0nB1xSAAUZnlcgb7c4O/N8gOSWfplTtES4Yq/pe50G6mDrT0XfRsDB4YDx0EQoazrA+IbX\n",
       "MN8WbNcE1TYQ0/bf/VYd9W2mJVjT9E8J5vPUnpf9LIH88z7CUW2DSIyMmnbwBk9zcqtWrWspV8FH\n",
       "ZYMtV5jM48WTDnHfMHSLqyUICHw3bnVZHcDibutRrWEuKtQcfEHalBMadXSyd+wjLEf6DPtbwZjm\n",
       "/QJZv5z7H0J+UHwdLW7a697xuCPgHlRUQoU+sd5La1QBmuDxgQAAATcBn25qQ38ABHWIpJmL2+9Y\n",
       "ToZ2WyGJvLk1PnrWAAst182nAi5agmTdkTcQMNpXusZRDYx9t9lyBqfQJUgN5JCtbqXez3mKU7KJ\n",
       "RCrkytzezoTQQGI0A9N7R+7P0BO1QI9KpYVr8ouBmKSaNh4XZBnMQwgz428ePahHaUKD/HZxbu89\n",
       "keWY2Skwy4Zq4nQjx/AAEjnGIogWw6wjHvUs4AfT1P18fkka2Q9Xqpi9VFouY0tLHB0ubMOMnVpa\n",
       "0xG3Rm+h4MT5b3bX8wGm+P4ZScXcMdSj0hcNFpGzPbQaQAuzXjdG9OPwMZi4dPffysq31uERgKp6\n",
       "mHXvCALzWbAaiP85ERgUtxzypPYpHYWGDDR8Zd8l0ikkyOVahPWDzd2pXvU8iQjdUGeuTEsvmr5r\n",
       "8MRQnC5tiwa5/wAABldBm3NJqEFsmUwII//+tSqAANlRqHKQdD5CVIAC6rwPovFay4qrfn+PSNod\n",
       "xluZJtvYObknvJWErzNrFrMc5TKdTDFdBB1NOaIAQHU08grrC5a5bS90bI2B5z4d1Bm6PcThcfsc\n",
       "zZ1wcLY45qKoG3MQYff0kql/FrWHVPQtYLsHwSx417tqnecvxuhip/WEzsx9xnn/a5txAlptlvDJ\n",
       "wQ/1gBTH/n+Sdy73c6k8uzg86jwOrKSIer1UALr40bDjT7ri0EeVNYHo46+K6eEShNxAp1AkFWkS\n",
       "x1HRIDeDEk8RV7Rein5JHC+veS5H2uScPhftNCScTyikxn6eehuFNdzVEKqpxyCxQLD3NW4Ps9uz\n",
       "nzMpAyO0IaWGmn+Kl6QiWw24UKiMBiw0dGdraPFQoHusqhTeXsWL0XnXTqhMJvdKl24UYhEldiru\n",
       "xJQPfn4EQwwSJSzIAmfCCVaU7XdgaNxVC2S/I7TSkoj4RqOBRIXjhueTx2QUOCXmNd9mNc1MoAW3\n",
       "rXG8UV5CvT3ZeH/DPlrsNnO8VNWZiym1dF+FklFkCB7mbyryBDmJndQCQZ+o+qK+JvVjJLcswXXX\n",
       "7IVLruEzJoH3DDVYncE2kVc3NzuplEfMIQMkXQYwAv8PwIIVFyCSCoaz+r4CW/LhKaBW6+SSZ30b\n",
       "V+Hm4hgQpY2nIJcnbENABTDwmD8RoJytR4kxcHBvCfiGGBzJnKjYRTbp82DS5vSyMSTeqdr0Mh33\n",
       "HK8U5xRaWZx4Y/ImRweUlybr7fxFqKANOcZRlPHF+Em34yvL8a+dkM/474QnJk1BIGMf9Jk8dtM7\n",
       "v+Cd4v7uAS9KHOEUSERpuukzmAbSDvzOUc0pALWRU/ntklno011bAilvv8ZSnwxzkDwCA48xD+RZ\n",
       "tvo/+H5oVFzzEgKdhO7snkcY49M1KdLvUNSOna7oyxYoUomkHQFCFLeM3/vduglDhYAxLgL2ti5t\n",
       "jigprlSPhUv1ZrjHtu1lhjEiDSCxFiKMaigcXJooBUa4VjEGAJbnG+CQRXtW7qLdjHIhjQ5pbK9c\n",
       "vYoVhl7AVvv1xC2DBpcQuVu4iQ/WpA1LUBJfONI4Uu/htoDJuiuAUHB0cX9m1ye4SOIxgJHfNPnb\n",
       "6NvYsCFYZak38+o8iprtZ/ePOb5aO3FnnOAeAoiNFXqGzl8kQ7ycgDkq87EzFqZPM789ldIewrGO\n",
       "vs/717IM3whXobYr7D1EYFsMbUCwZjA1NoTSkohdGwby3/sK5U66/CoEmkPXL3Htn3Hba2+NN7w5\n",
       "1l/rFirY7t21pO4w3Kkaa0yBdUcVYZm0U2DiN+yo2/11c0MhOl2my5qR9sIJxfYIXw/Fp0oDARFo\n",
       "JTWkRtZC+clNrkKLLnkFv3kGP+WbTH1xPxrXTgzzpzzHzJ5Y4Hp87ygAteuDvpmeAB/q9DTpd2aX\n",
       "J77nGWNP4aLvNfRWeDrwUvjJiUKL1YPWD3qdEis/NnepVuKD+Q3hSdHAwRuIek7GfCvnpBhIUqjv\n",
       "chkQLRlt0nAy8ashZyLgQDZcLdcVFFL28ZGW1ziUWPrXQkrlitNK/+AEZw44arDJEDuAO9Kx91bs\n",
       "uTCHSE1eK1GM+s+SwdSN2jOVRnAdbkMcRe1WeJiCDfJgd1sop/1rrth2dTl3qEZ22u9XwEBdVURb\n",
       "k1v/NF+P3MYrL7R4OyiFsYdZXL3aXBpCKvQDYKpsBrAnDdaNYUayt5RTyAddbk1ZLbdhBOdb3OUK\n",
       "g2CazaJiOu+XgSxaUpPhL7P2BJbVT0MSGwCaFkXPAFPwaW/FewIaXm678Iv9ZyBWjE+w2Jy2KO+c\n",
       "WN+O7en32ozzsoSuuYq05u3UKAI4S/FZiW8ewp9P+Bjl1gAsWZIFMTs/DG7e92NqEKjckS0vbtrk\n",
       "fZ/kErViS/9MT49r4XMq+mQmjYMPd9con+OXyCe4cn5SigHhUN0yczQVekc7ny9mjqj2KBMtFW/7\n",
       "nZJYQXFBS1Dy7dhTveROK1/hjmgThMIwlVlkT+ADlBAV91Z2s6AMIa0fe9UZ+G0kF3tBK/sDjv7r\n",
       "OyXL0dnHRzXRbRwK9unaYMxcNbT3ySh3GwMmYlyL3hoab34IRXdMZP4lG75m3P9RCUZjehUPy/4g\n",
       "Cg1OVko10LpRCMKALdwfF16jIR76oIb2XzUhwUo3O14Q4pmT3Fxtn+AAAAIZQZ+RRRUsO/8AA1Dq\n",
       "vGzI4AP6DLOL2WsJgnX0K6R4fIa7odbAtsmpDC6YAu7t6+0e0uPiiJG7T6Kf2y3z8Iwi0qToyRpq\n",
       "eDOemYwxPkxxJOG37XjIWphYy0kxrRynVi4zz8RxVmo1gjuO7TM91XxEnM18S7dnKD5ZGvVKC8Em\n",
       "Vd4q0fsJgz6+KYv7QrQofQ0fiWYUg1wm7HEQYyjf5+E+DPJwyXJoV+p7rBzeL3+vZCnmP2mx+HkI\n",
       "eUW23B4KWNFjT86Fx0cwoDzoG+FqMqsJr1fMiHgG0D2GO8+BAVFVvU6AGB9fGCI/4O25Ywe+Szx2\n",
       "+lirf4UI8sJmqyUsnhZlL22FPmILcOVeo2DVysZiDCyMtxviL/UqgG9K3ksgT1Y2GFkXsMzntQMQ\n",
       "f7EL71bIynEesmXPIo3R8BIqhPHvxicqyIj/rlHypP5bMcWcs4+B1SI9xnFj5d8DxlQwg/8nwwly\n",
       "npvfDgtjq/i1Ta1yS7qNUtyrRbIlbWULhpG1LyiAa3Iba11wHqNgdGta3+cp50w+vpJ+I3hX3itG\n",
       "SuOW9JkVILoTk/rPHqxGn2mwvJFzQeDORi1BAGODE0r9s8wSJGIsSgD9QG3jxBJ6OSeGAeYzqqnZ\n",
       "kEFek82qnZvZ4VrOkPAFokKxdym/3WUbfSLaQ8eA/lq4fyQY5IZs1uT9XrrHnpYrzFv42fTMTJLY\n",
       "ktVD34BMabuCmBG4AAABKAGfsHRDfwAEdYjQuYvbU2T8Ibz7UGpnhTXBHsQARsGdVgbdnrEOoRjp\n",
       "HyU+Umv1OQ5iHNl87ZDXuaflfVRrMR74+DY/3oNbHk7jKUnmCIr58X4/3zjWmWOMFwG6eqlBxJl3\n",
       "11fJdcbYKhMI+TjsByCtmdaFQW59B0ZE43/gGFVPw94slPVMSqc1i+ffXtrgqtcZSasySOUxGdBA\n",
       "O4tEf26nHk4gpot2n0nGiIayR7FslYl0BkHQqLdAkQKyefn3wdCy7wmrBnJuz01mQgX2NFgL06GM\n",
       "s/6qi2i9Nso86II/Xo+Td5DsrcOVSkvEBL94+9qRLuc/3d4lFGK1sDfgTRjysF4BeHPR8lprHrrz\n",
       "z09q5voTAlzXHX0cOcjOG0sEP8KJ3gAQACDhAAABDAGfsmpDfwAEthcw/PArRuRnRG6Yo09s+BvV\n",
       "QnkA6JHH/4aBCkjRk/OFPd0yYKSJbWrPg0mlQq5nTPrQqEMZ2J7LQy9tE2HCLxBXae3mGj+PcAuc\n",
       "MeBDHw4VJy2PAhdBpe4JaN/RAml3UQK7dGnuKt2T6RAgnHNXZnDZYMeFGJokY3mJjuW6/I3WzL7C\n",
       "NrbAHJHtc9PFIS3Blm/CRR5dbdLbZgzD3UbXMrMQNU0OwI82VTIXQrtRr++7DR3ETB0ys7KCVPyU\n",
       "fKm/90taK3gbJK4cUA+KheikE2jtVseNM8UWSUfXzuyS5Sd3PvkbSJ9EIyWGV7gpNnlvQwxzimvK\n",
       "gj4naXd6S1PLLbtgxYAAAAYiQZu3SahBbJlMCCP//rUqgADafP2wW3pFI/kAJon74x+mlgMPztYy\n",
       "LV0vag/QMxP5t/OHUqobU5uuOarF/fOy5wVYJIKAJEueckagMoMW7gmCyQJGpflv+c0EQXmfIjB3\n",
       "V7I5WU5YW8051rLYrWHmsFF0nj55gNvYYhU06UE/UTrqgtJSsyRaLFSVzmGeTRMUDN8+Q+Abp/gW\n",
       "XM8YHhpFfto1CcSxGNvf71ks0goIOtEFES1XVp/qZAJZ0rdjTWGQjNkXPOJuFLQGV7yeo0mBJ/wq\n",
       "hry0c4rMSL/XZuBHPrKg8psKOpaeRfzVply2mxfxbCQPgGO3ZTKvryH0UsGTAu36FCpZ+jaQ5IjS\n",
       "5snn82ViD8loSfMNRt+qSRW4yPtAw26PpXBiFWAN4CAzLT9waZcKFlXRiRFC9PEJv/Pp6uN8zZYV\n",
       "JP42T7+HBaM0vB9J0DJhbgVOFXPnw2WHtc52mirZ0EVQISkYW1JzCeMtBjABTHdzSR3NhcUJB6wy\n",
       "MGNYU3HOmTJbkIvZUf7S0ypjhUdL4w72M40vSNsYa8WJrltt4jtmVP3XLjxRZNxUP9/180GL5CKB\n",
       "EyGIcJJllWY6L8zldVipepFU8RsGbUxiUwzVHyk5OuNRGwSmlVXIXcnzTnab+OMRHkl9+Hc5jD1n\n",
       "t+jXNpX3R+hqVhUZ3hoqbaDa04B1PW8FIgipbOUKggFMhx1aTJWRljx7kEMZJlLaeK1IV68BoyB0\n",
       "626dGnR/goVmy/7AaOR04kmsWU9+39lVw2h2ZvEZynw6TYUBxY0hu2mqLPlfue03T0mQqGQijq79\n",
       "qXCD4Kz04zdGgNpXb349P6jspRgwQsi7Rym6sXu2O1z1yY7DaD6Sb+nNSO+MgCQOdeRZ7OO0LIOU\n",
       "3S2qWVULumNxVXwwLLpMidbjEGrEbFBc43Nua4OF4T3XBcOXsiRQ6zTa+GCKpnIb+8ha0Lkhl+1Q\n",
       "+gj05Cj2Pf0XErBllmBUb4mSsMbItKLhcRQSj/vfFUWY6toebfIP90Pl6vE0wdUAeXeV/BlbGqxu\n",
       "zf52/OkCbyqytXNu7wVcpnXzZ6ZjbX3SK/PW+35WCSP+y7ZkA4O8wI4UcER+DEkIzEv8ILJlV98k\n",
       "MWU0kpUHSsQ205lwPv5bnzBuExr4YVTJOtrWxwPecdvVShrQP71HXoelrp2w21VmrV0zEJYkx7tm\n",
       "B1GNHqGJPqpXu+MssSNUQsZhhQwokGA4rUTF6heXzwIW9kehwbvc4DkMvAbR2Prox8LwOV1lBp3R\n",
       "1vBaNf85z873F1jYAKYEhIQLoTq6raV8+O/jLISdg2d1+WrX5fQ4rs9rbV9cZbbmz+UquOX+2P1p\n",
       "tTuXqVrAf5CfIfXjerKjtTobSNZihu7LbTFol52CnXqidQoy5O/h77mQ9x6jtbCU0qzFghOlLEvc\n",
       "FZxKN4G0Yk8JpvR3ObZ+Qtyo18d+oFm7QC4qcgkm7l9/qi9RKC7ew2s0PNviH3TDCwqpJnGPwTVe\n",
       "2WyjykzFhT+RX3/hDWH/2DSM+cVYBWxULE+EbXV+wMKGySr+v4ERHQv2J34nXSmm1zfqThl83dfh\n",
       "xZU6nJ9HAL9ZmLG0DJ4/q9xhpbNImXcHszenYn8JU81/kPEYY6ufR9tC43ARgy02yq2RlOTL1tcu\n",
       "Vs87SUVgmepi8e4AAiW+o3Du48sneBpcEMJqfqgsL1QcFx33gJaSRTDuDIqTojXF/6pGf8Pf4O2J\n",
       "8oOY/83rFqnaTZYAafIbeLNI2w37hwlN1xwEJFok0U+yhLmJQFMO/e/LhPPa5qJGSWwI3u9klIlQ\n",
       "2hdOzUXFPYUiHFnTSpo9W9/PMqYAkwZ+dn2RXtGQ93xPU99agbrZp1THsY5+PRyRDSBPM2SnDJEb\n",
       "tK4KMxgIk41bCI5JgdTo6CF6CEWTFLe+NqRuJ8AraYvm7Oh0SAmBP/OQv3T+q65R5mVIL/4qhluZ\n",
       "PbngtpcaMUy1rlMY6JT2zwqu1X802Dj7nK1hKeWb2NDPuZByjEA5Vbvgn+QmlrxwUyrqCFvBTlrm\n",
       "58Cra3o+DM/NcQBRVm7dx93T21u2pqj+YDjAT9RtQz2SkVbkZ4YcxY7Hm9HKv6sxUgAAAlFBn9VF\n",
       "FSw7/wADUbIBLPO3eQUAE7HsJd0dTaUqpFJDaRqqDh7ndvhdw2WBzjy2DRlKZJK+MKCjH55CuwAe\n",
       "7fASPqdxSa05F3amOeKjQcG3RG+jVUIdjCTvMubRRQnF+UQppHfzKggwQgrrF3q/ChFV90xcUNIa\n",
       "Q+Jegf3W9z5k8vbpjnuN8VCWMkFKKPCoWoqUdAuujvwWO1pGJsS/RWqNd7Pjszte7Fr1MB5k39vt\n",
       "G7K3yQvkGjcrgUgT4lNf2KIF3wi1cQpW6Pjzm0JIUZuSVmneQsB+I1Ns/l15crfDHoIE0MaMIoar\n",
       "qmXBJAZ4VNgjRwAXlK15JS7tlAVICVDejoz5xKHoekizjK7rlDCW2Nswoj/Gw2iiSHfyN+s3v56f\n",
       "5bxmzbKSg2HU5xE6Ub7vCsnEc7gMa9IFc7dCsAuShvDpW6tL2oszWnf/N0mNhP4xvB2Nh1eQn7EA\n",
       "p17s0t2HAn+BBYVnt3EQhj11rDAdyi7WO0YZN5c15Rz+SYMWVp1uM6bugzXdDFSFveU3jcXbO7m8\n",
       "6j4mowU3kljOy/a+u0oe4EP5AYL+ItUjVy7JzyKpO9TOs5/D9JtFAbAOgo5F4At2502fufLxv86I\n",
       "jPi2mW8eZtoWqZb8ZfVbfjcudO6loW1wsUo8YEDkLgqwvhJKN4K9Tx2y/3g9pKFvuEdAcjXmhojb\n",
       "8+XeZG6ALMw/O/0TrK0SCnWNVKQqZGsRH3u6WJKan5Ez3pXaZ5SNNKVgkqZlHBzsjnykVbYy0EW5\n",
       "f94sKKkI0K0IM0Tf6C8VHYJBiwAAASUBn/R0Q38ABLZuzxugQQbE+uwBoMpx00WXlLcax7zp0dlM\n",
       "YkMxWTsBlc0aZJbeM2AEnaiGW0lKfNlOSBl2nkv4WHCUhG+e/XoHI6I00gt8urQh+yolp9tGd1Oa\n",
       "IvHgeTAaVwL7SDa8OmaTtzNYrDkXq450kX3ZJQpjMsESpKYW3SDL/nZux6wpA3feB1lbb416GZok\n",
       "38C5QBayknlhwLs0MTZPNuUItKYQ0nAWdUJTLyBexHDaAcf+qDcVOlhtTJOQnofNMaLydb8RxYdI\n",
       "NSdw/ep7xvG/MCTgeoj993AWxHzoH+WfmUAp3ds5bgmCNQDhGXCjacpKArytlU63HhWNwqREFACA\n",
       "mXbfhHEdJrW44MpJXxqm+QW6JpVPEsuHhVIvPD3FTAAAASsBn/ZqQ38ABHWIpKLheAEIsEN+K8sI\n",
       "0hFvg3YwtxWQti5sKYVYiq4f1ZtL9sr1giH0+w4Hv0HVr/W5luQa6QFIVFmaNufHGU0tUd0Y/GNI\n",
       "3Ya5CaNA8HN4q0CpQL9Xcn/YKMALE8BnKq6lblOJxWbHNyhF4JHkIwLyVAMTKc2OaS7kjHVuf20s\n",
       "84QjzQQM+t9OVe4nxrx+tR8TN7Jo/WijfzJpPouyyDqswidqsClPUsC6TvplWHPX2Ni/WHZd+sLh\n",
       "055ZH/wGJNXArSbN4fL0pgD76p7Ym6ldW5MZ1MSW5l2yQ5zMlMoDZ2/tEIPNb46ufoQbCS+651+4\n",
       "HJvNVbfApdKL0MEA62EvulB0LO3AGUh1v6/M1KTPTCZypMtCMB/XkMEmInL+D60C0wAABMNBm/tJ\n",
       "qEFsmUwIIf/+qlUAAdTpEIDj6+U4UqDV+kAXxA3e9+YqgjBT3YRFbVedidxignxLYMTB46Nx5JCV\n",
       "Ja7Mt40HsNqCOO7Th6sjB3yXhNn0loSPTeHeua1u9IiR9xnqFhvoganRCWE4XYjL7ByckPX6iyrk\n",
       "NxEvpl03AifEeptnLJ3kbDUJnSwyH6uwBvk1bPuv1q3DVTVqS8Y0trseLPkf+npWNypkCv0BZCl/\n",
       "8idr6xTjviAUfVe7Tm+spXR2svDFIwZ9qlmH3OENq186tHSsnuwXQqORAKX6eHb64xbdkX09Cdys\n",
       "dXCm4Ms1NqzNwbuMIfKGP7GK4/iaJmNeXfFDnh2UX9VsQBg64Q0jnVoMka4DSFt2DdlP4W6z9TRC\n",
       "8aBgD2Lwbq2D6HbBWqM7o+Ww1ojkOSEHCASUL+zdU1K+p/sv9FFYS0VspLNwe3QISRqp6RC2bw9L\n",
       "TwV+8MxOcLjbKvh/g3HK3nS/zOsEAtNV4yWFkunGgAAWcLtXodIPRPqvFrzjX8+tMSLOVgVj2DK7\n",
       "jj16TxvDLTJjRWf2aRw590I2bUiE6HJb68IvY/CfGfRvOd8VEKhDvCCARE8GPMqfm/TmndW9jJYf\n",
       "fakS4sQ1+gJ8PGhGb54u+0+ccd1nBu/hZR0PhKI9JhCURvjTBGQygwnhiVub/mZbyNyFf6mVrLJs\n",
       "0+IYI79GN8UVEm0LbiNhOscxvNFMPicLgL++YQVBZfPHWlGtJHeaKl3L13HtcYRD+HTKglmX75ct\n",
       "wnDHXK+n6HjAlX40+R8AqBJyGk3htHIFhKsymQLZXbYpA4GVrDIPxdXSur5OO4iTP5POIFzPeMdy\n",
       "Ry69lHkO82e0O1KUWd9BJNuaMMg+DaZ1rzKuzgv3mAaKRnLuDUmTylw4SWIUDkttM8VPAcAiTlif\n",
       "MM76jU1I6lTWmNEHJP3pdj0zp0g9gCEYJBIU1PkoHIS5gPbxrtpa6RF9kXXIjiEv/jHi4GOkdRbi\n",
       "wgXSN7HMAuu8cVig666hQQhy22Itu5fBgexZ4MIlRJaQuO4LdrK012cNPMoLZ/rIx7csDnTRTda+\n",
       "h38DIZ0SRzuKvT1THgMe1IV6pIwE7dMdcKQQQuGLV2GUYzw5NhcTFh2B4j7CEZnrl+z8+7zVpGkc\n",
       "konoXsttKukDvI9OXFbrHORt/S6Z4HHw81wD1722FVOjy765k7CgR2XFK9QGic09EA6F8mhc01E3\n",
       "r6ld5xpVJo0IbdwWKPE49tboNWUMjVZqbZ86Lv9A/yyQVd00nBiUG6+ZtmfCZXFDoRvfaVrRHkPw\n",
       "ueBvgWcHgHAZsrNP3TcLo5ZJ6MMzctv8yfiIHBKOONGqUESmx8Jc1KTzFvLl8z2KwI9qL1hwRGN2\n",
       "2A6OWW4IIa0ASlInvtgld0jkDCAGkIHAnz2NPP2WrxbGJ1LdlAmnrZjdMB2NaId7X3SJ4uyogN/t\n",
       "BVmWD+L/K4pyCG2AMdY4vf34Xcg5LgTmKguBijbkXDTzgJrkd07JR32CZ/xBrUhy3fz3TMWQ6Gzz\n",
       "7ce9zoDQTsaU0CeAO8LNTHAswP8d1u+4R0RAvneWOtf8FrRj9Vdah9wnzS2NSqMXCShl8+NrwP9P\n",
       "ugqJs2n62IzjPyQkTNiqXTZhAAACGUGeGUUVLDv/AAM2dUNBsi+GDxzUefACU6u8ZnSvVWJAOc6r\n",
       "9d7YnqxDMKVTfiXWEq71pZDKaT6avi7vZtDrddkDo3uac6/lIf1rkryX7WDDeCZJBngOAXiQrfgT\n",
       "5d0osP3u33Ct0usLEBCly6foGMsiW1npovyKm4Kmtx0F2y34QD+eDdramxjONs/YbLOYfvpAyQEZ\n",
       "C+vPq8iXP9TmqmW3mhg8q/N8ybOjvrcIiZeuHSRhFK4JgqHIXmrL3rucg7UOOnPT3TRNwunr9bkC\n",
       "/u7TnojJmt22RcjPBM4qPmUPoadCSts2H/VSx3B/Knw/LnjEMSOOwq2k0bvLQWGaqn1rR/vGb+wr\n",
       "hGy5fY+uTsW541nEfYoayP/WrHcVEiJ6OzLLMV3FBqeQ4ANhqWqSfoS8rPRry11KTuMK044YGGQb\n",
       "2mTkP0cbnCWVIWTvPOoyt7JCrTfGM2pp/iHkZFgzlb9L6oF5c9Ds/2MMpuH/Hl482UNtrkl9j4rc\n",
       "8gV+C5LUvWqxIb72KQg+sA6/LZHAuscU6j/TqeWKdc0GJIkqQpVLMuk01yKkIOQOVvTzcWUDTz06\n",
       "+MWxpaeB+mjtxJydEm6NFUdwXJCHVXS1NIgPC1f0DFmr5zuUbxH9AZvcdDbHpufXX7XqFLAdpePn\n",
       "PF/kxvcbDO7jtoO2jse4AgilyEpsTJcAaLZ17TTwl6AZW43EaBUxwOszb4ikgAAAAREBnjh0Q38A\n",
       "BIdOYic9HlunLlgA2Ys5s9bZt/JONIz6b5qTFa2FkNmim031aV26RDLqRGLi8xbzReCHklZ9WGN0\n",
       "yat6yoLtI4RErQhMF3USE7YyYfrg04yuIWHQ9xfd1mHqz8fsAGMICI+U7ZyKyjjvw/oUtE7Y+aYu\n",
       "QO+BLuIQPRv6YrefERnkv3NG8OWyZ0R9HFbSfXG0VoxGxOJVIriM7o+uhtk11zPN81mY4CctyeyQ\n",
       "re+aJF8lBzx4KdXaBtFmv+3Ss70MjGqhXooomMImO3SPovyEAWFw21Lnn7uOqZSlP4AbOHVoLE7I\n",
       "kH1ETd7JUGFV6fGgAMIdLNOyGGi2Jn7ZxRpmQpURvxAVGswOScEAAAFMAZ46akN/AASMdyT21mXF\n",
       "Jixf5YAPxeD8nEdH0P08d2WFDGIuVuJ3i3ZtNXo7q76nlmrpe7QdevssTiiR66AW3LFEZqLf94ep\n",
       "P2Pw3uXmRida/peTSlk2VM3Sb0WJ7WfJpgZpBeaHKCjxK28jLa2HJkvt3rX9rtdXQODJx2QSZV1E\n",
       "RRbLvW481c/uUo6jbnNfrLpBz6FEx96ECfMhsEoEynp3ZC478l9ApQ7mA+3T9YKynGZKRKuDKsj+\n",
       "qVgMtwnm3Oo2b9EUyyxTCmwn427liaW0SohF8LTbePx31F6hELOdKY1MoLZj5pOjUr2c2Oa5XX3O\n",
       "9zew6lx7gRWEyEoYs9kacOLm3uIogYQsIjjqEla37mrr5GszbwSqF3iOQHn/gniuDLrpvpxQw3Bx\n",
       "9SDkA0/k9ORS+ZnWnVowhlA6Zqpwuk03zGbjfuKBHTAAAAMHQZo/SahBbJlMCHf//qmWAAb4X5u1\n",
       "NACWnN0X6iF/TvnFV38TjO2zKA7l1zytpJNyQKlRYBHvHfhJLiCKo/+J38U/8u649KzazwPH2SSN\n",
       "9w7DmsJGXC6hq8BEKjHiDsbPSRDai8VXECJ2EYH1pF1+vce7L0gREXwBqlxb1Vd37Did1Jekjf1U\n",
       "ZA4lBxBggFLU0sLTfOTRQ8//vTvgQBtOwgb/p+7rauEIFf2sllJNJNRVy/WCo5yqQMtvpWO8wTGU\n",
       "p29/ztwSfETQ6E1GOdsSDoj+n+DXImftGdwE20STZVGHelEU86po8BEeSdG+8EXIItKpquezqD//\n",
       "GAjQfZGX7FNX53I1Yd35TZclc99NLHZ+1iUzPYSTQBjQi7e9pWbEPxq9zQ0xHOmxdaikhUj4kXQY\n",
       "9gqJYX87t25Q6RIR+j9vyLXIeevHpdhUZVknjxoCk0GwYYO5DBOo477UtnGLpjCMxeX6Q+AqHI3N\n",
       "iC5j4tny8pCz/qpIU1Fvlz3/bJAk+pnmant7e21qx4+CeiB/z9k3R6P5RbvcNmFpvW+WZX/y7K3c\n",
       "v07MyCo1nOvfmeA9mE3oQ8bevqAEVpVhK24dAw5BMyyor0V/6vRIjf3y8yjWV59zV6Ckoe2WwmDq\n",
       "yY2tYLl5UwXKMcGTJDfWmNM9HpyHVCNomORpN5QjtMl6449ftvYy5KKueUg7yfgdmAQid5FW3GIl\n",
       "EF5dnWLde8JOHYZOESh4PRSZcCQucsJFKDc4aZplH8ZGffMxY38wwyRM0Rr3GPUGWO8c5MkxQ1TG\n",
       "FYLSEjBFe8Hkof86dqOjqtEYycJ2OROB3HsMheQiAWQPL51XBv1FuH80/gMBZXKXG1qDPQgKwAft\n",
       "s+zr6eP1aK+qXFLGT+etIelBCImSHvZAqHXAlDAquZ01YpvznF7btD2H0cuYugJ/alrTOz3702mf\n",
       "/9if/2n/+Y/lUk0/TCgnpRXRyt8L8qxoskKLu2M7fZyopOH3Oc3vNDL5A9jwwaK2Fv0K1hP0/qOU\n",
       "ug50VeFKIESc8PVEQQAAAkBBnl1FFSw7/wADeZQ9v82lZdQAteiRzOCz8+Kn/LuT4wVnMUUVqF2/\n",
       "OPjJsagu6ddV/kqkOM/BWfuaS00LIMP0+vBpSdS2XcUtQxEggZmdG1U3LGtLviBEg69cuvXM7Dbm\n",
       "Ou6+VM8D+DnEm4dpRSOIFtjkp1hGVWJijog/2CWt0wPdgCy/gPCevKi4Sdqu8eQO9Edbf9OAYaQt\n",
       "JQQl7G3HYkZvO7ufFxvZoJPJjzDYI3puL/O7Hs7VJHZtz1ByFDGNaBeYw33MeXe60VJ1E8G1Eecl\n",
       "Clun74B92Kcm1xIBACcmSE9Jz6PrtAn9RbfR871BVg3t8E8+XboXwPxr3WgcjCOFP/hZ2bV7MGjm\n",
       "TOJN8pKfZuE2svVwEfPUtS/cj6A6/QX1t/rbhLa6b1bCFEpR5In9mVmQ61kskgb1wjZvCgfMcwYA\n",
       "STghpMwZlfwqExXZQNU9HFD8Q0Qg+dFXQVSSKgxmWP/jcjgPaT76N5S90dHgEtt69fIdjPDe0B7E\n",
       "0cJlD7EWEdwzXgYZkRPcMrIwR7btwVQRuOyFX/V4n+o1Jimnw05lG5Rcp98jPvsYQE1oR2fJ/kZF\n",
       "8XX0Bs2jeSFG7GAR1cmqIpJ+co1U8U6CJHvTidibsJX3u4XU0WCfn+7EI+eKl3SlHNt/XNVeLF9q\n",
       "d7h6vbYobLv1I22DIP32zZPsXSSP36g/hQax6b7w9vYsmLn5TC98VkmXVPuuWTnWM3oaPVOXgZib\n",
       "p6nsZh7ZZNpqOxISyG2tg111aeVI5L0AAAElAZ58dEN/AAT6JKe2NACHnj91yDcCYATBw8d4Qz3j\n",
       "Nx25BUUObWQUnxn/axwrzWrscvB7Uu8UogDJzDUqDJKywsSHDGM3Q/qGOFyQMy0wxqVqwBA5ISvU\n",
       "StsVdCXl76ggBvtblI+XM5Jmpf78SrNUpC1FfNZKbuB1dCp7LivX5gU0wEnoFevv/xxNJj6UUvSY\n",
       "rBeMPM6mG+mwHneEtNw5U8iXj+Fm0LcO65Y4VXtMjv1gj1tQbySlMFLCppIg3FEr/E/9b4Df3HAw\n",
       "vc0LJDfhVGAsPsk20uevPQY+Oq6EKZThI+wC1SgSMkgLG0j1BacEUWc4r+mmBifgtybv7mAO1pMD\n",
       "Uz2FRa2CVMSAhUJciZtFsvD/zCWo441WZtampGcg4hVzBswAAAFoAZ5+akN/AAT4WfOUWmCx+Fz7\n",
       "t7AsvRzd2FTfr5m+oMnitn/TIR/2fv5KwuAFDsan2yTfHwbJibc5yCRoJBg1NRuS362KdrCyCgQU\n",
       "ra5NMuKDy2LVIXwI49rqEUVKASucqYMNnmwAUKlvlBl2EU7vxhq7qMhsOvtH/7hnDGPDxW1gSy5+\n",
       "J59SeLgSOF69HlKMdE16XRkWGT8Fw73PXg6nFW0YQ6Tjui2YHm+78vElz+6RWF/YJug7lCdLGSd4\n",
       "Knz41/XU+RBt6GS2XuBOefI8lB3Xv7V7k4FkS+GdOv9fOnEwkchORcWY5UotarvAz8hiN5MFxIgt\n",
       "5h0oyc7WS3UD20shNzfChGQb5eHAIpbUWYSOOsAfe49BiEKXXYUaijBgDPoxrb2a5yMBem9sU+UR\n",
       "A7w2hwx4TyecqhhUahqWJMa8a43577NckChE+9Pu+z1yI2vPt0WOqavxpex3u8Zgfs2U7OTD81W0\n",
       "AAAB0EGaYEmoQWyZTAhv//6nhAAN0KOVSABO2fcy98+qy6kUEnuBQvV3bu4yeDRF88hUBX4dFCEY\n",
       "Rj+D9lbqzGJevi+5MNPX/3qnrynlIj3rkepn9OrNnLVN/9C1e/BJwp1mkmx33UelGTozht0gD7rV\n",
       "CE3ZsjFqKDWTlZ7bF5u9RBoDy7Fv9OER708HPb+iL1XHpbGDTp+iKmXYI9iSWEV/En1E7HZXgfKk\n",
       "dThc0ugiEzjFNyQJOxK+Ga/masfiI73Wqykj+N3t/OB6zlqtlJFBmyo3O4h28RCJugQfaW/lyuVv\n",
       "8mIF+KRfyFqrxFCE3ZqmlQGwjdhOa0QR0r4em/PcDTEH4wn7kDR16EMb8DPMo205/S68rgH5yxpd\n",
       "JJGBw5m16PcH0+sbOQ/WRzYOljnPwQuyN/E7LRRh/f4qpFyLVB5Kkz48t8IzRUeMtiu1MN03WrN0\n",
       "RHC4Lid0zNo9G6lDciwJT+viDotzEssGrukKFHuxCsa+IaoHRFCrBD46lR/hleVvSJrhxc9zTSYm\n",
       "9hgy5BFrIz8BNbo8b1et559FQOMDVmaxfXMZh9/s4qtdDGT00P3PdiBsk80JFKqhUhuNDQsfL/oH\n",
       "7tyRZj91rnxrTMqpAAAGM21vb3YAAABsbXZoZAAAAAAAAAAAAAAAAAAAA+gAABlkAAEAAAEAAAAA\n",
       "AAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAA\n",
       "AAAAAAAAAAAAAAAAAAIAAAVddHJhawAAAFx0a2hkAAAAAwAAAAAAAAAAAAAAAQAAAAAAABlkAAAA\n",
       "AAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAQAAAAANgAAABaAAA\n",
       "AAAAJGVkdHMAAAAcZWxzdAAAAAAAAAABAAAZZAAACAAAAQAAAAAE1W1kaWEAAAAgbWRoZAAAAAAA\n",
       "AAAAAAAAAAAAKAAAAQQAVcQAAAAAAC1oZGxyAAAAAAAAAAB2aWRlAAAAAAAAAAAAAAAAVmlkZW9I\n",
       "YW5kbGVyAAAABIBtaW5mAAAAFHZtaGQAAAABAAAAAAAAAAAAAAAkZGluZgAAABxkcmVmAAAAAAAA\n",
       "AAEAAAAMdXJsIAAAAAEAAARAc3RibAAAALRzdHNkAAAAAAAAAAEAAACkYXZjMQAAAAAAAAABAAAA\n",
       "AAAAAAAAAAAAAAAAAANgAWgASAAAAEgAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n",
       "AAAAAAAAABj//wAAADJhdmNDAWQAFv/hABlnZAAWrNlA2C/5YQAAAwABAAADABQPFi2WAQAGaOvj\n",
       "yyLAAAAAHHV1aWRraEDyXyRPxbo5pRvPAyPzAAAAAAAAABhzdHRzAAAAAAAAAAEAAABBAAAEAAAA\n",
       "ABRzdHNzAAAAAAAAAAEAAAABAAACEGN0dHMAAAAAAAAAQAAAAAEAAAgAAAAAAQAADAAAAAABAAAE\n",
       "AAAAAAEAAAwAAAAAAQAABAAAAAABAAAIAAAAAAEAAAwAAAAAAQAABAAAAAABAAAMAAAAAAEAAAQA\n",
       "AAAAAQAACAAAAAABAAAMAAAAAAEAAAQAAAAAAQAACAAAAAABAAAMAAAAAAEAAAQAAAAAAQAADAAA\n",
       "AAABAAAEAAAAAAEAABAAAAAAAgAABAAAAAABAAAIAAAAAAEAABQAAAAAAQAACAAAAAABAAAAAAAA\n",
       "AAEAAAQAAAAAAQAADAAAAAABAAAEAAAAAAEAABQAAAAAAQAACAAAAAABAAAAAAAAAAEAAAQAAAAA\n",
       "AQAAFAAAAAABAAAIAAAAAAEAAAAAAAAAAQAABAAAAAABAAAUAAAAAAEAAAgAAAAAAQAAAAAAAAAB\n",
       "AAAEAAAAAAEAABQAAAAAAQAACAAAAAABAAAAAAAAAAEAAAQAAAAAAQAAFAAAAAABAAAIAAAAAAEA\n",
       "AAAAAAAAAQAABAAAAAABAAAUAAAAAAEAAAgAAAAAAQAAAAAAAAABAAAEAAAAAAEAABQAAAAAAQAA\n",
       "CAAAAAABAAAAAAAAAAEAAAQAAAAAAQAAFAAAAAABAAAIAAAAAAEAAAAAAAAAAQAABAAAAAABAAAU\n",
       "AAAAAAEAAAgAAAAAAQAAAAAAAAABAAAEAAAAAAEAAAgAAAAAHHN0c2MAAAAAAAAAAQAAAAEAAABB\n",
       "AAAAAQAAARhzdHN6AAAAAAAAAAAAAABBAAAi2gAAAc4AAABTAAAAhAAAAEQAAACBAAAAVQAAADIA\n",
       "AABpAAAAMgAAAFYAAABuAAAALAAAAGoAAABtAAAAKQAAAGgAAAAtAAAApwAAADwAAAAxAAAAdwAA\n",
       "A60AAABUAAAAMQAAALIAAAPtAAABNgAABVAAAAI1AAABDQAAARsAAAaVAAACXQAAAVsAAAE/AAAH\n",
       "fwAAAmMAAAE2AAABSwAAB2oAAAJbAAABMQAAASgAAAZGAAACAAAAASQAAAE7AAAGWwAAAh0AAAEs\n",
       "AAABEAAABiYAAAJVAAABKQAAAS8AAATHAAACHQAAARUAAAFQAAADCwAAAkQAAAEpAAABbAAAAdQA\n",
       "AAAUc3RjbwAAAAAAAAABAAAALAAAAGJ1ZHRhAAAAWm1ldGEAAAAAAAAAIWhkbHIAAAAAAAAAAG1k\n",
       "aXJhcHBsAAAAAAAAAAAAAAAALWlsc3QAAAAlqXRvbwAAAB1kYXRhAAAAAQAAAABMYXZmNTcuODMu\n",
       "MTAw\n",
       "\">\n",
       "  Your browser does not support the video tag.\n",
       "</video>"
      ]
     },
     "metadata": {},
     "execution_count": 16
    },
    {
     "output_type": "display_data",
     "data": {
      "text/plain": [
       "<Figure size 432x288 with 0 Axes>"
      ]
     },
     "metadata": {}
    }
   ]
  },
  {
   "cell_type": "markdown",
   "source": [
    "Now, we can plot the loss landscape depending on the angle $\\alpha$ of `v0`. We create a scan plot by sampling a `CenteredGrid` from a function.\n",
    "The resulting plot matches Figure 11 from the [DiffTaichi paper](https://arxiv.org/pdf/1910.00935.pdf) with small deviations.\n",
    "We noticed the loss landscape is highly dependent on the number of simulation steps."
   ],
   "metadata": {
    "id": "0bWqjVLbeHDm",
    "pycharm": {
     "name": "#%% md\n"
    }
   }
  },
  {
   "cell_type": "code",
   "source": [
    "x0 = vec(x=.1, y=.5)\n",
    "v0 = lambda alpha: vec(x=0.3 * math.cos(alpha), y=0.3 * math.sin(alpha))\n",
    "plot(CenteredGrid(lambda alpha: loss_function(x0, v0(alpha))[0], alpha=1000, bounds=Box(alpha=(-PI/4, PI/4))))"
   ],
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 473
    },
    "id": "L7TgruUFSvXp",
    "outputId": "1412de59-4258-4f5d-9240-043c9c7a41c9",
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "execution_count": 8,
   "outputs": [
    {
     "output_type": "stream",
     "name": "stderr",
     "text": [
      "/usr/local/lib/python3.7/dist-packages/phi/field/_field_math.py:405: RuntimeWarning: concat() default implementation is slow on large dimensions (balls=11). Please implement __concat__()\n",
      "  elements = geom.concat([f.geometry for f in fields], dim, sizes=[f.shape.get_size(dim) for f in fields])\n",
      "/usr/local/lib/python3.7/dist-packages/phi/field/_field_math.py:407: RuntimeWarning: concat() default implementation is slow on large dimensions (balls=11). Please implement __concat__()\n",
      "  colors = math.concat([math.expand(f.color, f.shape.only(dim)) for f in fields], dim)\n",
      "/usr/local/lib/python3.7/dist-packages/phi/math/_magic_ops.py:101: RuntimeWarning: expand() default implementation is slow on large shapes (alphaᵇ=1000). Please implement __expand__()\n",
      "  values = [expand(v, all_batch_dims) for v in values]\n"
     ]
    },
    {
     "output_type": "display_data",
     "data": {
      "text/plain": [
       "<Figure size 864x360 with 1 Axes>"
      ],
      "image/png": "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\n"
     },
     "metadata": {
      "needs_background": "light"
     }
    }
   ]
  },
  {
   "cell_type": "markdown",
   "source": [
    "Next, we perform simple gradient descent optimization on the loss landscape.\n",
    "However, due to the chaotic loss landscape, this performs rather poorly.\n",
    "We plot the found trajectory after 5 iterations along with the goal point (X)."
   ],
   "metadata": {
    "id": "fI3a3b01eUHs",
    "pycharm": {
     "name": "#%% md\n"
    }
   }
  },
  {
   "cell_type": "code",
   "source": [
    "loss_grad = math.gradient(loss_function, 'x0,v0')\n",
    "x0 = vec(x=.1, y=.5)\n",
    "v0 = vec(x=.3, y=0)\n",
    "learning_rate = .01\n",
    "for iter in range(5):\n",
    "    (loss, trj), (dx0, dv0) = loss_grad(x0, v0)\n",
    "    print(f\"Iter={iter}  loss={loss:.3f}  x0={x0}  ∇={dx0}  v0={v0}  ∇={dv0}\")\n",
    "    x0 -= learning_rate * dx0\n",
    "    v0 -= learning_rate * dv0\n",
    "final_loss, trj = loss_function(x0, v0)\n",
    "print(f\"Final loss: {final_loss}\")\n",
    "plot(vis.overlay(trj.t[::16].geometry, vec(x=0.9, y=0.75)), animate='t')"
   ],
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "N4MPC5Clff1g",
    "outputId": "dac814c7-8f31-43a3-e9eb-22fa13053021",
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "execution_count": null,
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "Iter=0  loss=\u001B[94m0.6501343\u001B[0m  x0=\u001B[94m(x=0.100, y=0.500)\u001B[0m \u001B[93mfloat64\u001B[0m  ∇=\u001B[94m(x=-0.654, y=1.529)\u001B[0m  v0=\u001B[94m(x=0.300, y=0.000)\u001B[0m  ∇=\u001B[94m(x=-0.889, y=1.734)\u001B[0m\n"
     ]
    }
   ]
  }
 ]
}